Apache HTTP Server Version 2.5

Dieses Dokument ergänzt die mod_rewrite
Referenzdokumentation. Es
beschreibt die grundlegenden Konzepte, die für die Verwendung von
mod_rewrite notwendig sind. Andere Dokumente gehen
mehr ins Detail, aber dieses Dokument soll dem Anfänger den Einstieg
erleichtern.
Einführung
Reguläre Ausdrücke
RewriteRule-Grundlagen
Umschreibungs-Flags
Umschreibungsbedingungen
Umschreibungs-Maps
.htaccess-DateienDas Apache-Modul mod_rewrite ist ein sehr
leistungsfähiges und ausgereiftes Modul, das eine Möglichkeit bietet,
URL-Manipulationen durchzuführen. Damit können Sie nahezu alle Arten von
URL-Umschreibungen durchführen, die Sie möglicherweise benötigen. Es ist
jedoch etwas komplex und kann für Anfänger einschüchternd sein. Es besteht
auch die Tendenz, Umschreibungsregeln als magische Formeln zu behandeln
und sie zu verwenden, ohne wirklich zu verstehen, was sie tun.
Dieses Dokument versucht, ausreichend Hintergrundwissen zu vermitteln, damit das Folgende verstanden und nicht nur blind kopiert wird.
Denken Sie daran, dass viele gängige URL-Manipulationsaufgaben nicht
die volle Leistungsfähigkeit und Komplexität von mod_rewrite
erfordern. Für einfache Aufgaben siehe mod_alias und die
Dokumentation zur Zuordnung von URLs zum
Dateisystem.
Stellen Sie schließlich vor dem Fortfahren sicher, dass Sie die
Protokollebene von mod_rewrite mit der
LogLevel-Direktive auf eine der
Trace-Ebenen konfigurieren. Obwohl dies eine überwältigende Menge an
Informationen liefern kann, ist es unverzichtbar bei der Fehlersuche in
der mod_rewrite-Konfiguration, da es Ihnen genau zeigt,
wie jede Regel verarbeitet wird.
mod_rewrite verwendet das Vokabular der Perl-kompatiblen regulären Ausdrücke. In
diesem Dokument versuchen wir nicht, eine detaillierte Referenz zu
regulären Ausdrücken zu liefern. Dafür empfehlen wir die PCRE-Manpages, die Perl-Manpage für reguläre
Ausdrücke und Mastering
Regular Expressions von Jeffrey Friedl (die dritte Auflage stammt
von 2006, aber die Syntax regulärer Ausdrücke ist im Wesentlichen
unverändert, und es bleibt die maßgebliche Referenz zu diesem Thema).
In diesem Dokument versuchen wir, genügend Regex-Vokabular zu
vermitteln, um Ihnen den Einstieg zu erleichtern, ohne Sie zu
überfordern, in der Hoffnung, dass RewriteRules wissenschaftliche Formeln sind und keine
magischen Beschwörungen.
Die folgenden sind die minimalen Bausteine, die Sie benötigen, um
reguläre Ausdrücke und RewriteRules
zu schreiben. Sie stellen sicherlich kein vollständiges Vokabular für
reguläre Ausdrücke dar, aber sie sind ein guter Ausgangspunkt und sollten
Ihnen helfen, grundlegende reguläre Ausdrücke zu lesen und eigene zu
schreiben.
| Zeichen | Bedeutung | Beispiel |
|---|---|---|
. |
Stimmt mit jedem einzelnen Zeichen überein | c.t stimmt mit cat, cot,
cut usw. überein |
+ |
Wiederholt die vorherige Übereinstimmung ein oder mehrmals | a+ stimmt mit a, aa,
aaa usw. überein |
* |
Wiederholt die vorherige Übereinstimmung null oder mehrmals | a* stimmt mit allem überein, womit auch a+
übereinstimmt, aber auch mit einem leeren String |
? |
Macht die Übereinstimmung optional | colou?r stimmt mit color und
colour überein |
\ |
Maskiert das nächste Zeichen | \. stimmt mit . (Punkt) überein und nicht
mit jedem einzelnen Zeichen, wie oben erklärt |
^ |
Als Anker bezeichnet, stimmt mit dem Anfang des Strings überein | ^a stimmt mit einem String überein, der mit a beginnt |
$ |
Der andere Anker, stimmt mit dem Ende des Strings überein | a$ stimmt mit einem String überein, der mit a endet |
( ) |
Gruppiert mehrere Zeichen zu einer Einheit und erfasst eine Übereinstimmung zur Verwendung als Rückreferenz | (ab)+ stimmt mit ababab überein - das heißt,
das + gilt für die Gruppe. Für mehr zu Rückreferenzen
siehe unten |
[ ] |
Eine Zeichenklasse - stimmt mit einem der Zeichen überein | c[uoa]t stimmt mit cut, cot oder
cat überein |
[^ ] |
Negative Zeichenklasse - stimmt mit jedem nicht angegebenen Zeichen überein | c[^/]t stimmt mit cat oder c=t überein,
aber nicht mit c/t |
In mod_rewrite kann das Zeichen ! vor
einem regulären Ausdruck verwendet werden, um ihn zu negieren. Das heißt,
ein String gilt nur dann als übereinstimmend, wenn er nicht mit dem Rest
des Ausdrucks übereinstimmt.
Hier ist eine wichtige Sache zu beachten: Wann immer Sie
Klammern in Pattern oder in einem der
CondPattern verwenden, werden intern Rückreferenzen
erstellt, die mit den Strings $N und %N
(siehe unten) verwendet werden können. Diese stehen für die
Erstellung des Substitution-Parameters einer
RewriteRule oder des
TestString-Parameters einer
RewriteCond zur Verfügung.
Erfassungen in den RewriteRule-Mustern stehen (kontraintuitiv) allen
vorhergehenden RewriteCond-Direktiven
zur Verfügung, da der RewriteRule-Ausdruck
vor den einzelnen Bedingungen ausgewertet wird.
Abbildung 1 zeigt, an welche Stellen die Rückreferenzen zur Expansion übertragen werden und illustriert den Ablauf der RewriteRule-/RewriteCond-Zuordnung. In den nächsten Kapiteln werden wir erkunden, wie diese Rückreferenzen verwendet werden, also machen Sie sich keine Sorgen, wenn es Ihnen zunächst etwas fremd erscheint.

Abbildung 1: Der Rückreferenz-Ablauf durch eine Regel.
In diesem Beispiel würde eine Anfrage für /test/1234 in /admin.foo?page=test&id=1234&host=admin.example.com umgewandelt.
Eine RewriteRule besteht
aus drei durch Leerzeichen getrennten Argumenten. Die Argumente sind:
Das Pattern ist ein regulärer Ausdruck. Es wird anfänglich (für die erste Umschreibungsregel oder bis eine Ersetzung erfolgt) gegen den URL-Pfad der eingehenden Anfrage abgeglichen (der Teil nach dem Hostnamen, aber vor einem Fragezeichen, das den Beginn eines Query-Strings anzeigt) oder im Verzeichniskontext gegen den Pfad der Anfrage relativ zum Verzeichnis, für das die Regel definiert ist. Sobald eine Ersetzung erfolgt ist, werden die folgenden Regeln gegen den ersetzten Wert abgeglichen.

Abbildung 2: Syntax der RewriteRule-Direktive.
Die Substitution kann selbst eines von drei Dingen sein:
RewriteRule "^/games" "/usr/local/games/web/puzzles.html"
Dies bildet eine Anfrage auf einen beliebigen Ort in Ihrem Dateisystem ab,
ähnlich wie die Alias-Direktive.
RewriteRule "^/games$" "/puzzles.html"
Wenn DocumentRoot auf
/usr/local/apache2/htdocs gesetzt ist, würde diese Direktive
Anfragen für http://example.com/games auf den Pfad
/usr/local/apache2/htdocs/puzzles.html abbilden.
RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R]
Dies weist den Client an, eine neue Anfrage für die angegebene URL zu stellen.
/usr/) im Dateisystem existiert, während dies bei 2 nicht der Fall ist (d.h. es gibt kein /bar/ als Verzeichnis auf der obersten Ebene im Dateisystem).Die Substitution kann auch Rückreferenzen auf Teile des eingehenden URL-Pfads enthalten, die vom Pattern erfasst wurden. Betrachten Sie Folgendes:
RewriteRule "^/product/(.*)/view$" "/var/web/productdb/$1"
Die Variable $1 wird durch den Text ersetzt, der vom
Ausdruck innerhalb der Klammern im Pattern erfasst wurde.
Beispielsweise würde eine Anfrage für
http://example.com/product/r14df/view auf den Pfad
/var/web/productdb/r14df abgebildet.
Wenn mehr als ein Ausdruck in Klammern vorhanden ist, stehen sie
in der Reihenfolge in den Variablen $1, $2,
$3 usw. zur Verfügung.
Das Verhalten einer RewriteRule kann durch die Anwendung
eines oder mehrerer Flags am Ende der Regel modifiziert werden.
Beispielsweise kann das Übereinstimmungsverhalten einer Regel durch
die Anwendung des [NC]-Flags auf Groß-/Kleinschreibung
unempfindlich gemacht werden:
RewriteRule "^puppy.html" "smalldog.html" [NC]
Weitere Details zu den verfügbaren Flags, ihren Bedeutungen und Beispiele finden Sie im Dokument Umschreibungs-Flags.
Eine oder mehrere RewriteCond-Direktiven
können verwendet werden, um die Typen von Anfragen einzuschränken, die der
nachfolgenden RewriteRule
unterliegen. Das erste Argument ist eine Variable, die eine Eigenschaft
der Anfrage beschreibt, das zweite Argument ist ein regulärer
Ausdruck, der mit der Variable übereinstimmen muss, und ein optionales
drittes Argument ist eine Liste von Flags, die die Art der Auswertung
der Übereinstimmung modifizieren.

Abbildung 3: Syntax der RewriteCond-Direktive
Um beispielsweise alle Anfragen von einem bestimmten IP-Bereich an einen anderen Server zu senden, könnten Sie Folgendes verwenden:
RewriteCond "%{REMOTE_ADDR}" "^10\.2\."
RewriteRule "(.*)" "http://intranet.example.com$1"
Wenn mehr als eine RewriteCond
angegeben wird, müssen alle übereinstimmen, damit die
RewriteRule angewendet wird.
Um beispielsweise Anfragen abzulehnen, die das Wort "hack" in ihrem
Query-String enthalten, es sei denn, sie enthalten auch ein Cookie mit
dem Wort "go", könnten Sie Folgendes verwenden:
RewriteCond "%{QUERY_STRING}" "hack"
RewriteCond "%{HTTP_COOKIE}" !go
RewriteRule "." "-" [F]
Beachten Sie, dass das Ausrufezeichen eine negative Übereinstimmung angibt, sodass die Regel nur angewendet wird, wenn das Cookie nicht "go" enthält.
Übereinstimmungen in den regulären Ausdrücken der
RewriteConds können als Teil
der Substitution in der
RewriteRule über die Variablen
%1, %2 usw. verwendet werden. Beispielsweise
leitet Folgendes die Anfrage abhängig vom für den Zugriff auf die Website
verwendeten Hostnamen in ein anderes Verzeichnis:
RewriteCond "%{HTTP_HOST}" "(.*)"
RewriteRule "^/(.*)" "/sites/%1/$1"
Wenn die Anfrage für http://example.com/foo/bar war,
dann enthält %1 den Wert example.com und
$1 den Wert foo/bar.
Die RewriteMap-Direktive
bietet eine Möglichkeit, sozusagen eine externe Funktion aufzurufen,
um Ihre Umschreibung durchzuführen. Dies wird im
ergänzenden RewriteMap-Dokument
ausführlicher besprochen.
Umschreibungen werden typischerweise in der Hauptserverkonfiguration
(außerhalb eines <Directory>-Abschnitts)
oder innerhalb von <VirtualHost>-Containern
konfiguriert. Dies ist die einfachste Art, Umschreibungen durchzuführen,
und wird empfohlen. Es ist jedoch möglich, Umschreibungen innerhalb von
<Directory>-Abschnitten
oder .htaccess-Dateien
auf Kosten zusätzlicher Komplexität durchzuführen. Diese Technik wird
als verzeichnisbasierte Umschreibung bezeichnet.
Der Hauptunterschied zu serverweiten Umschreibungen besteht darin, dass
der Pfadpräfix des Verzeichnisses, das die .htaccess-Datei
enthält, vor dem Abgleich in der RewriteRule
entfernt wird. Zusätzlich sollte RewriteBase
verwendet werden, um sicherzustellen, dass die Anfrage korrekt zugeordnet wird.