<-
Apache > HTTP-Server > Dokumentation > Version 2.5 > Rewrite

Fortgeschrittene Techniken mit mod_rewrite

Verfügbare Sprachen:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

Dieses Dokument ergänzt die mod_rewrite Referenzdokumentation. Es bietet einige fortgeschrittene Techniken zur Verwendung von mod_rewrite.

Beachten Sie, dass viele dieser Beispiele nicht unverändert in Ihrer speziellen Serverkonfiguration funktionieren werden. Es ist daher wichtig, dass Sie sie verstehen, anstatt die Beispiele einfach auszuschneiden und in Ihre Konfiguration einzufügen.

Siehe auch

top

URL-basiertes Sharding über mehrere Backends

Beschreibung:

Eine 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".

Lösung:

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.

top

Dynamische Inhaltsregenerierung

Beschreibung:

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.

Lösung:
Dies wird durch den folgenden Regelsatz erreicht:
# 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.

top

Lastverteilung

Beschreibung:

Wir möchten die Last zufällig auf mehrere Server verteilen, indem wir mod_rewrite verwenden.

Lösung:

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.

Diskussion

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.

top

Strukturierte Benutzerverzeichnisse

Beschreibung:

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.

Lösung:

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"
top

Umleitung von Ankern

Beschreibung:

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.

Lösung:

Verwenden Sie das [NE]-Flag in der RewriteRule. NE steht für No Escape (Nicht maskieren).

Diskussion:
Diese Technik funktioniert natürlich auch mit anderen Sonderzeichen, die mod_rewrite standardmäßig URL-kodiert.
top

Zeitabhängiges Umschreiben

Beschreibung:

Wir möchten mod_rewrite verwenden, um je nach Tageszeit unterschiedliche Inhalte auszuliefern.

Lösung:

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.
top

Umgebungsvariablen basierend auf URL-Teilen setzen

Beschreibung:

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.

Lösung:

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.

Verfügbare Sprachen:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn