Apache HTTP Server Version 2.5

Dieses Dokument ergänzt die mod_rewrite
Referenzdokumentation. Es bietet
einige fortgeschrittene Techniken zur Verwendung von mod_rewrite.
URL-basiertes Sharding über mehrere Backends
Dynamische Inhaltsregenerierung
Lastverteilung
Strukturierte Benutzerverzeichnisse
Umleitung von Ankern
Zeitabhängiges Umschreiben
Umgebungsvariablen basierend auf URL-Teilen setzenEine gängige Technik zur Verteilung der Serverlast oder des Speicherplatzes wird als "Sharding" bezeichnet. Bei Verwendung dieser Methode verwendet ein Frontend-Server die URL, um Benutzer oder Objekte konsistent auf separate Backend-Server zu "verteilen".
Eine Zuordnung von Benutzern zu Zielservern wird in externen Map-Dateien gepflegt. Diese sehen wie folgt aus:
user1 physical_host_of_user1
user2 physical_host_of_user2
# ... und so weiter
Wir legen dies in eine map.users-to-hosts-Datei. Das
Ziel ist es, folgende Zuordnung vorzunehmen:
/u/user1/anypath
zu
http://physical_host_of_user1/u/user/anypath
Somit muss nicht jeder URL-Pfad auf jedem physischen Backend-Host gültig sein. Der folgende Regelsatz erledigt dies für uns mit Hilfe der Map-Dateien, wobei server0 ein Standardserver ist, der verwendet wird, wenn ein Benutzer keinen Eintrag in der Map hat:
RewriteEngine on
RewriteMap users-to-hosts "txt:/path/to/map.users-to-hosts"
RewriteRule "^/u/([^/]+)/?(.*)" "http://${users-to-hosts:$1|server0}/u/$1/$2"
Siehe die RewriteMap-Dokumentation
und das RewriteMap-HowTo
für weitere Informationen zur Syntax dieser Direktive.
Wir möchten Inhalte dynamisch generieren, sie aber statisch speichern, sobald sie einmal generiert wurden. Diese Regel prüft, ob die statische Datei vorhanden ist, und generiert sie, falls nicht. Die statischen Dateien können bei Bedarf regelmäßig entfernt werden (z.B. per Cron) und werden bei Bedarf neu generiert.
# This example is valid in per-directory context only
RewriteCond "%{REQUEST_URI}" !-U
RewriteRule "^(.+)\.html$" "/regenerate_page.cgi" [PT,L]
Der -U-Operator prüft, ob der Teststring
(in diesem Fall REQUEST_URI) eine gültige URL ist. Er
macht dies über eine Unteranfrage. Falls diese Unteranfrage fehlschlägt -
das heißt, die angeforderte Ressource existiert nicht - ruft diese
Regel das CGI-Programm /regenerate_page.cgi auf, das
die angeforderte Ressource generiert und im Dokumentenverzeichnis
speichert, sodass beim nächsten Aufruf eine statische Kopie
ausgeliefert werden kann.
Auf diese Weise können Dokumente, die selten aktualisiert werden, in statischer Form ausgeliefert werden. Wenn Dokumente aktualisiert werden müssen, können sie aus dem Dokumentenverzeichnis gelöscht werden, und sie werden dann beim nächsten Aufruf erneut generiert.
Wir möchten die Last zufällig auf mehrere Server verteilen,
indem wir mod_rewrite verwenden.
Wir verwenden RewriteMap und eine Serverliste,
um dies zu erreichen.
RewriteEngine on
RewriteMap lb "rnd:/path/to/serverlist.txt"
RewriteRule "^/(.*)" "http://${lb:servers}/$1" [P,L]
serverlist.txt enthält eine Liste der Server:
## serverlist.txt
servers one.example.com|two.example.com|three.example.com
Wenn Sie möchten, dass ein bestimmter Server mehr Last als die anderen erhält, fügen Sie ihn mehrmals zur Liste hinzu.
Apache wird mit einem Lastverteilungsmodul ausgeliefert -
mod_proxy_balancer - das wesentlich flexibler und
funktionsreicher ist als alles, was Sie mit mod_rewrite
zusammenstellen können.
Einige Websites mit Tausenden von Benutzern verwenden ein
strukturiertes Heimatverzeichnis-Layout, d.h. jedes
Heimatverzeichnis befindet sich in einem Unterverzeichnis, das
(beispielsweise) mit dem ersten Zeichen des Benutzernamens beginnt.
So ist /~larry/anypath gleich
/home/l/larry/public_html/anypath,
während /~waldo/anypath gleich
/home/w/waldo/public_html/anypath ist.
Wir verwenden den folgenden Regelsatz, um die Tilde-URLs in das obige Layout umzusetzen.
RewriteEngine on RewriteRule "^/~(([a-z])[a-z0-9]+)(.*)" "/home/$2/$1/public_html$3"
Standardmäßig funktioniert die Umleitung zu einem HTML-Anker nicht,
da mod_rewrite das #-Zeichen maskiert und
es in %23 umwandelt. Dies wiederum unterbricht die
Umleitung.
Verwenden Sie das [NE]-Flag in der
RewriteRule. NE steht für No Escape (Nicht maskieren).
mod_rewrite standardmäßig URL-kodiert.Wir möchten mod_rewrite verwenden, um je nach Tageszeit
unterschiedliche Inhalte auszuliefern.
Es gibt viele Variablen namens TIME_xxx
für Rewrite-Bedingungen. In Verbindung mit den speziellen
lexikographischen Vergleichsmustern <STRING,
>STRING und =STRING können wir
zeitabhängige Umleitungen durchführen:
RewriteEngine on
RewriteCond "%{TIME_HOUR}%{TIME_MIN}" >0700
RewriteCond "%{TIME_HOUR}%{TIME_MIN}" <1900
RewriteRule "^foo\.html$" "foo.day.html" [L]
RewriteRule "^foo\.html$" "foo.night.html"
Dies liefert den Inhalt von foo.day.html
unter der URL foo.html von
07:01-18:59 und zur restlichen Zeit den
Inhalt von foo.night.html.
mod_cache, Zwischenproxys
und Browser können jeweils Antworten zwischenspeichern und dazu
führen, dass eine der beiden Seiten außerhalb des konfigurierten
Zeitfensters angezeigt wird.
mod_expires kann verwendet werden, um diesen
Effekt zu kontrollieren. Es ist natürlich viel besser, die
Inhalte einfach dynamisch auszuliefern und basierend auf der
Tageszeit anzupassen.Manchmal möchten wir eine Art Status beibehalten, wenn wir ein Umschreiben durchführen. Beispielsweise möchten Sie sich merken, dass dieses Umschreiben stattgefunden hat, damit Sie später prüfen können, ob eine Anfrage über dieses Umschreiben kam. Eine Möglichkeit dafür ist das Setzen einer Umgebungsvariable.
Verwenden Sie das [E]-Flag, um eine Umgebungsvariable zu setzen.
RewriteEngine on RewriteRule "^/horse/(.*)" "/pony/$1" [E=rewritten:1]
Später in Ihrem Regelsatz können Sie diese Umgebungsvariable mit einer RewriteCond prüfen:
RewriteCond "%{ENV:rewritten}" =1
Beachten Sie, dass Umgebungsvariablen eine externe Umleitung nicht überleben. Sie könnten stattdessen das [CO]-Flag verwenden, um ein Cookie zu setzen. Für Verzeichniskontext- und htaccess-Umschreibungen, bei denen die endgültige Ersetzung als interne Umleitung verarbeitet wird, werden Umgebungsvariablen aus der vorherigen Runde des Umschreibens mit dem Präfix "REDIRECT_" versehen.