Apache HTTP Server Version 2.5

Dieses Dokument ergänzt die mod_rewrite
Referenzdokumentation. Es beschreibt
vielleicht eines der wichtigsten Konzepte bezüglich mod_rewrite -
nämlich, wann man es vermeiden sollte.
mod_rewrite sollte als letzter Ausweg betrachtet werden, wenn andere
Alternativen nicht ausreichen. Die Verwendung, wenn einfachere
Alternativen existieren, führt zu Konfigurationen, die verwirrend, fragil und
schwer zu warten sind. Das Verständnis der verfügbaren Alternativen ist
ein sehr wichtiger Schritt zur Beherrschung 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.
Die häufigste Situation, in der mod_rewrite das
richtige Werkzeug ist, ist wenn die allerbeste Lösung Zugriff auf die
Serverkonfigurationsdateien erfordert und Sie diesen Zugriff nicht haben.
Einige Konfigurationsdirektiven sind nur in der Serverkonfigurationsdatei
verfügbar. Wenn Sie sich in einer Hosting-Situation befinden, in der Sie
nur mit .htaccess-Dateien arbeiten können, müssen Sie möglicherweise auf
mod_rewrite zurückgreifen.
mod_alias stellt die Direktiven Redirect und RedirectMatch bereit, die eine Möglichkeit
bieten, eine URL zu einer anderen umzuleiten. Diese Art der einfachen
Umleitung einer URL oder einer Klasse von URLs an einen anderen Ort sollte
mit diesen Direktiven und nicht mit RewriteRule erfolgen. RedirectMatch
ermöglicht es Ihnen, einen regulären Ausdruck in Ihre Umleitungskriterien
einzubinden, was viele der Vorteile der Verwendung von
RewriteRule bietet.
Eine häufige Verwendung von RewriteRule ist die Umleitung
einer ganzen Klasse von URLs. Beispielsweise müssen alle URLs im Verzeichnis
/one nach http://one.example.com/ umgeleitet werden,
oder alle http-Anfragen müssen nach https
umgeleitet werden.
Diese Situationen werden besser mit der Redirect-Direktive
behandelt. Denken Sie daran, dass Redirect Pfadinformationen
beibehält. Das heißt, eine Umleitung für die URL /one
wird auch alle darunter liegenden URLs umleiten, wie
/one/two.html und /one/three/four.html.
Um URLs unter /one nach
http://one.example.com umzuleiten, tun Sie Folgendes:
Redirect "/one/" "http://one.example.com/"
Um einen Hostnamen zu einem anderen umzuleiten, beispielsweise
example.com zu www.example.com, siehe das
Rezept für kanonische Hostnamen.
Um http-URLs nach https umzuleiten, tun Sie
Folgendes:
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL-Konfiguration hier
</VirtualHost>
Die Verwendung von RewriteRule für diese Aufgabe kann
angemessen sein, wenn andere RewriteRule-Direktiven im
selben Geltungsbereich vorhanden sind. Dies liegt daran, dass bei
Redirect- und RewriteRule-Direktiven im selben
Geltungsbereich die RewriteRule-Direktiven immer zuerst
ausgeführt werden, unabhängig von der Reihenfolge in der
Konfigurationsdatei.
Im Fall der http-zu-https-Umleitung wäre die Verwendung
von RewriteRule angemessen, wenn Sie keinen Zugriff auf die
Hauptserverkonfigurationsdatei haben und diese Aufgabe stattdessen in einer
.htaccess-Datei erledigen müssen.
Die Alias-Direktive bietet
eine Zuordnung von einem URI zu einem Verzeichnis - normalerweise einem
Verzeichnis außerhalb Ihres DocumentRoot.
Obwohl es möglich ist, diese Zuordnung mit mod_rewrite
durchzuführen, ist Alias aus Gründen
der Einfachheit und Leistung die bevorzugte Methode.
Alias "/cats" "/var/www/virtualhosts/felines/htdocs"
Die Verwendung von mod_rewrite für diese Zuordnung kann
angemessen sein, wenn Sie keinen Zugriff auf die Serverkonfigurationsdateien
haben. Alias kann nur im Server- oder VirtualHost-Kontext verwendet werden
und nicht in einer .htaccess-Datei.
Symbolische Links wären eine weitere Möglichkeit, dasselbe zu erreichen,
wenn Sie Options FollowSymLinks auf Ihrem Server aktiviert
haben.
Obwohl es möglich ist, virtuelle Hosts
mit mod_rewrite zu verwalten, ist dies selten der richtige Weg. Das
Erstellen einzelner <VirtualHost>-Blöcke
ist fast immer der richtige Ansatz. Falls Sie eine enorme Anzahl virtueller
Hosts haben, erwägen Sie die Verwendung von
mod_vhost_alias, um diese Hosts automatisch zu erstellen.
Module wie mod_macro sind ebenfalls nützlich, um eine
große Anzahl virtueller Hosts dynamisch zu erstellen.
Die Verwendung von mod_rewrite für die Erstellung
virtueller Hosts kann angemessen sein, wenn Sie einen Hosting-Dienst
verwenden, der Ihnen keinen Zugriff auf die Serverkonfigurationsdateien
gewährt und Sie daher auf die Konfiguration mittels
.htaccess-Dateien beschränkt sind.
Siehe das Dokument Virtuelle Hosts mit mod_rewrite für weitere Details, wie Sie dies erreichen können, wenn es Ihnen immer noch als der richtige Ansatz erscheint.
RewriteRule bietet das [P]-Flag, um umgeschriebene URIs über
mod_proxy weiterzuleiten.
RewriteRule "^/?images(.*)" "http://imageserver.local/images$1" [P]
In vielen Fällen jedoch, wenn kein tatsächlicher Musterabgleich
erforderlich ist, wie im obigen Beispiel, ist die ProxyPass-Direktive die bessere Wahl.
Das Beispiel hier könnte wie folgt dargestellt werden:
ProxyPass "/images/" "http://imageserver.local/images/"
Beachten Sie, dass Sie unabhängig davon, ob Sie RewriteRule oder ProxyPass verwenden, die
ProxyPassReverse-Direktive
benötigen, um Umleitungen vom Backend-Server korrekt weiterzuleiten:
ProxyPassReverse "/images/" "http://imageserver.local/images/"
Sie müssen möglicherweise stattdessen RewriteRule verwenden,
wenn andere RewriteRules im selben Geltungsbereich aktiv sind,
da eine RewriteRule in der Regel vor einem
ProxyPass wirksam wird und somit das gewünschte Ergebnis
vorwegnehmen kann.
mod_rewrite wird häufig verwendet, um eine bestimmte
Aktion basierend auf dem Vorhandensein oder Fehlen einer bestimmten
Umgebungsvariable oder eines Anfrage-Headers durchzuführen. Dies kann
effizienter mit der <If>-Direktive
erreicht werden.
Betrachten Sie beispielsweise das häufige Szenario, in dem
RewriteRule verwendet wird, um einen kanonischen
Hostnamen zu erzwingen, wie www.example.com anstelle von
example.com. Dies kann mit der <If>-Direktive wie hier gezeigt
erreicht werden:
<If "req('Host') != 'www.example.com'">
Redirect "/" "http://www.example.com/"
</If>
Diese Technik kann verwendet werden, um Aktionen basierend auf jedem
beliebigen Anfrage-Header, Antwort-Header oder Umgebungsvariable
durchzuführen und mod_rewrite in vielen gängigen
Szenarien zu ersetzen.
Siehe insbesondere die Dokumentation zur
Ausdrucksauswertung für einen Überblick darüber, welche Arten von
Ausdrücken Sie in <If>-Abschnitten
und in bestimmten anderen Direktiven verwenden können.