Apache: Jaki jest najlepszy sposób obsługi tysięcy stałych przekierowań?

20

Mamy listę 3000 301 przekierowań. Potrzebujemy pomocy w sprawie

  1. Jakie byłoby najlepsze miejsce na ich umieszczenie? Wydaje się, że umieszczenie tych 3000 linii w vhost w httpd.conf byłoby bałaganem.
  2. Jakie są zalecane sposoby obsługi tysięcy adresów URL?
  3. Jak wpłynie to na szybkość ładowania strony i obciążenie serwera Apache?

Dzięki.

ucker
źródło

Odpowiedzi:

29

Możesz użyć Includedyrektywy w, httpd.confaby móc utrzymać przekierowania w innym pliku. Nie byłoby to jednak zbyt wydajne, ponieważ każde żądanie musiałoby być sprawdzane pod kątem wielu wyrażeń regularnych. Wymagane będzie także ponowne uruchomienie serwera po każdej zmianie pliku.

Lepszym sposobem na tak wiele przekierowań byłoby użycie dyrektywy typu RewriteMap w dbmcelu zadeklarowania mapy z URI na przekierowania. W ten sposób będzie wydajna, ponieważ wyszukiwania dbm są bardzo szybkie, a po zmianie mapy nie trzeba ponownie uruchamiać serwera, ponieważ httpdsprawdza czas modyfikacji pliku mapy.

Reguły przepisywania wyglądałyby tak (testowane na moim komputerze Fedora 16):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

Mapa dbm zostałaby utworzona z mapy tekstowej /etc/httpd/conf/redirects.txtwyglądającej tak:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

za pomocą polecenia

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db
Tometzky
źródło
Dziękuję za odpowiedź. Próbowałem tego, ale otrzymywałem błędy: moja zawartość przekierowań w jednym wierszu. Txt (wartości rozdzielone spacjami) mojadomena.com/experyment mojadomena.com/nazw_strona Dało mi błąd analizy w wierszu „RewriteCond $ {redirects: $ 1}! =" " . Błąd składni w wierszu 314 pliku /usr/local/apache/conf/httpd.conf: RewriteCond: złe znaczniki flagi Skomentowałem to, a potem zaczął się apache, ale odwiedzanie mydomain.com/experiment (lub dowolnego innego adresu URL z mydomain) dało mi błąd „żądanie zostało przekierowane w sposób, którego nie można było zrealizować”.
ucker
Apache nie uruchamia się ponownie z powyższym fragmentem. Czy mógłbyś mi pomóc? Nie widzę żadnego związanego z tym błędu w żadnym pliku dziennika.
ucker
Powiedziałem, że nie został przetestowany - spodziewałem się, że będzie trzeba go trochę ulepszyć. Przepraszam, myślałem, że to wystarczy. Httpd nie zaczął się, ponieważ nie może być spacji między !=i ""- Poprawiłem teraz mój przykład do działającej i przetestowanej wersji.
Tometzky,
Jeszcze jeden komentarz: musisz zastosować inne podejście, jeśli przekierowania muszą zależeć od ciągów zapytań (wszystko po ?adresie URL), ale jest to również możliwe . Tak jak teraz, po prostu dodaje ciąg zapytania do przekierowania, na przykład http://yourserver.com/foo?q=barprzekierowuje do http://serverfault.com/?q=bar.
Tometzky
Dziękuję za aktualizację. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbdał błąd RewriteMap dbm type db is invalid. Ale kiedy RewriteMap redirects txt:/etc/httpd/conf/redirects.txtgo użyłem , zadziałało. Nadal chcę korzystać z metody mieszania, jak wyjaśniono, zamiast zwykłego tekstu. Ale nie mogłem wiele znaleźć na temat błędu dbm. Dzięki za pomoc.
ucker
2

Napisałbym skrypt, który generuje nowy VHOST za pomocą samych linków z listy.

Lucas Kauffman
źródło