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

Einführung in Apache mod_rewrite

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

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.

Siehe auch

top

Einführung

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

top

Reguläre Ausdrücke

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.

Regex-Vokabular

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.

Verfügbarkeit von Regex-Rückreferenzen

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.

Ablauf der RewriteRule- und RewriteCond-Zuordnung
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.

top

RewriteRule-Grundlagen

Eine RewriteRule besteht aus drei durch Leerzeichen getrennten Argumenten. Die Argumente sind:

  1. Pattern: welche eingehenden URLs von der Regel betroffen sein sollen;
  2. Substitution: wohin die übereinstimmenden Anfragen gesendet werden sollen;
  3. [flags]: Optionen, die die umgeschriebene Anfrage beeinflussen.

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.

Syntax der RewriteRule-Direktive
Abbildung 2: Syntax der RewriteRule-Direktive.

Die Substitution kann selbst eines von drei Dingen sein:

1. Ein vollständiger Dateisystempfad zu einer Ressource
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.

2. Ein Web-Pfad zu einer Ressource
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.

3. Eine absolute URL
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.

Beachten Sie, dass 1 und 2 exakt dieselbe Syntax haben. Der Unterschied besteht darin, dass bei 1 die oberste Ebene des Zielpfads (d.h. /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.

top

Umschreibungs-Flags

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.

top

Umschreibungsbedingungen

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.

Syntax der RewriteCond-Direktive
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.

top

Umschreibungs-Maps

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.

top

.htaccess-Dateien

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.

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