Apache: Was ist der beste Weg, um mit Tausenden permanenter Weiterleitungen umzugehen?

20

Wir haben eine Liste von 3000 301 Weiterleitungen. Wir brauchen Hilfe bei

  1. Was wäre der beste Ort, um diese zu platzieren? Es scheint ein Chaos zu sein, diese 3000 Zeilen in vhost in der httpd.conf zu platzieren.
  2. Welche Möglichkeiten werden für den Umgang mit Tausenden von URLs empfohlen?
  3. Wie stark werden die Seitenladegeschwindigkeit und die Auslastung des Apache-Servers beeinflusst?

Vielen Dank.

ucker
quelle

Antworten:

29

Sie können die IncludeDirektive in verwenden httpd.conf, um Weiterleitungen in einer anderen Datei zu verwalten. Es wäre jedoch nicht sehr effizient, da jede Anforderung mit einer Vielzahl regulärer Ausdrücke verglichen werden müsste. Auch ein Neustart des Servers wäre nach jeder Änderung in der Datei erforderlich.

Eine bessere Möglichkeit für so viele Weiterleitungen wäre die Verwendung der RewriteMap- Direktive des Typs dbm, um eine Zuordnung von URIs zu Weiterleitungen zu deklarieren. Auf diese Weise wird es effizient, da DBM-Suchvorgänge sehr schnell sind und Sie nach einer Änderung in der Zuordnung keinen Server neu starten müssen, um die Änderungszeit der Zuordnungsdatei zu httpdüberprüfen.

Eine Umschreiberegeln würde so aussehen (getestet auf meinem Fedora 16 Computer):

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

Und dbm map würde aus einer Textkarte erstellt, die so aussieht /etc/httpd/conf/redirects.txt:

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

mit einem Befehl

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db
Tometzky
quelle
Danke für die Antwort. Ich habe es versucht, habe aber Fehler erhalten: mein einzeiliger Inhalt der Datei redirects.txt (durch Leerzeichen getrennte Werte) mydomain.com/experiment mydomain.com/new_page Es gab mir einen Analysefehler in der Zeile 'RewriteCond $ {redirects: $ 1}! = "" . Syntaxfehler in Zeile 314 von /usr/local/apache/conf/httpd.conf: RewriteCond: Ungültige Flag-Begrenzer Ich habe das auskommentiert und dann hat Apache begonnen, aber der Besuch von mydomain.com/experiment (oder einer anderen URL von mydomain) hat mir Fehler gebracht msgstr "Anfrage wird so umgeleitet, dass sie nicht abgeschlossen werden konnte".
ucker
Apache startet nicht mit dem obigen Snippet neu. Kannst du bitte helfen? Ich kann in keiner der Protokolldateien einen diesbezüglichen Fehler feststellen.
Ocker
Ich sagte, es sei ungetestet - ich hätte erwartet, dass es etwas Optimierungsbedarf geben würde. Ich dachte es wäre genug, sorry. Httpd wurde nicht gestartet, da es zwischen !=und kein Leerzeichen geben kann. ""Ich habe mein Beispiel auf eine funktionierende und getestete Version korrigiert.
Tometzky
Noch ein Kommentar: Sie müssten einen anderen Ansatz verwenden, wenn Ihre Weiterleitungen von Abfragezeichenfolgen abhängen müssen (alles danach ?in der URL), aber es ist auch möglich . So wie es jetzt ist, würde es nur eine Abfragezeichenfolge hinzufügen, um umzuleiten, zum Beispiel http://yourserver.com/foo?q=barumzuleiten http://serverfault.com/?q=bar.
Tometzky
Danke für das Update. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbgab fehler RewriteMap dbm type db is invalid. Aber als ich es benutzt habe, hat RewriteMap redirects txt:/etc/httpd/conf/redirects.txtes funktioniert. Ich möchte immer noch gehackt vorgehen, wie Sie es erklärt haben, anstatt mit einfachem Text. Aber ich konnte nicht viel über den dbm-Fehler herausfinden. Danke für Ihre Hilfe.
ucker
2

Ich würde ein Skript schreiben, das einen neuen VHOST mit nur den Links aus der Liste generiert.

Lucas Kauffman
quelle