Webserver/mod rewrite

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] Allgemeines - URLs manipulieren mit mod_rewrite

mod_rewrite ist ein Modul, das Sie mit Hilfe der LoadModule-Anweisung in Ihrer httpd.conf aktivieren können. Mit diesem Modul sind Sie in der Lage, URLs einfach zu manipulieren. Das heißt, ein Besucher, der eine von Ihrem Server verwaltete URL aufruft, kann beispielsweise automatisch auf eine andere Adresse umgeleitet werden. Um solche Umleitungen zu realisieren, stellt Ihnen mod_rewrite eine Reihe von Anweisungen zur Verfügung, die im folgenden kurz erläutert werden sollen. Sie können solche Regeln an unterschiedlichen Stellen notieren, beispielsweise in einem Directory-Container innerhalb Ihrer httpd.conf, in einem VirtualHost-Abschnitt oder aber innerhalb einer .htaccess-Datei. Von dieser letzten Möglichkeit wird zunehmend Gebrauch gemacht, da immer mehr Provider ihren Kunden den Einsatz solcher Dateien gestatten.

Die Apache-Entwickler selbst betonen, dass mod_rewrite ein "mächtiger Killer" sei: "Mit mod_rewrite schießen Sie sich beim ersten Gebrauch entweder selbst in den Fuß und wollen es dann nie wieder verwenden, oder aber Sie lernen es wegen seiner Power lieben und wollen es Ihr ganzes weiteres Leben nicht mehr missen".

Beispiel
RewriteEngine on RewriteRule (.*)\.html$ /cgi-bin/script.pl?var=$1

Das Beispiel bewirkt, dass alle Zugriffe auf .html-Dateien im Basis-Verzeichnis des Webservers auf ein Script umgeleitet werden, wobei der Name der aufgerufenen Datei als Parameter übergeben wird.

Grundsätzlich benötigt man für URL-Manipulationen nur die RewriteRule-Direktive. Allerdings muss einmal mit Rewrite Engine mod_rewrite eingeschaltet werden. Obwohl es bei den meisten Direktiven egal ist, ob Sie diese in einer Server-Konfigurationsdatei wie die httpd.conf oder in einer .htaccess-Datei verwenden, sollten Sie, um Performance-Einbußen zu vermeiden, diese in der Server-Konfiguration verwenden, falls Ihnen das erlaubt ist. Einige Optionen verursachen ähnliche Probleme, weshalb Sie alle Optionen nur mit Bedacht benutzen sollten.

[Bearbeiten] RewriteBase - Basis für eine Umleitung definieren

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden:

Sie benötigen RewriteBase, wenn das Verzeichnis, in dem die Umleitung stattfindet, nicht über Ihren eigentlichen (physischen) Namen erreichbar ist (beispielsweise, wenn man einen Alias auf das Verzeichnis gesetzt hat). Sie müssen mod_rewrite dann mitteilen, wie das Verzeichnis erreichbar ist.

Beispiel
RewriteEngine on # # die Datei liegt im Verzeichnis /abc/def # erreichbar ist dieses Verzeichnis aber über /xyz # bspw. weil in der httpd.conf folgendes gesetzt wurde: # Alias /xyz /abc/def # RewriteBase /xyz RewriteRule ^(.*)\.htm$ $1.html # macht alle *.html auch als *.htm erreichbar

Da das physische Verzeichnis /abc/def nicht darüber aufgerufen wird, würde, wenn man keine RewriteBase angibt, die RewriteRule nicht funktionieren. Durch diese Angabe macht man mod_rewrite den passenden Alias bekannt.

[Bearbeiten] RewriteCond - Bedingung für eine Umleitung definieren

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden:

RewriteCond beschreibt eine Bedingung, die erfüllt sein muss, damit die RewriteRule ausgeführt wird.

Erwartet als Parameter:

  • Test-String - eine Zeichenkette, die überprüft werden soll
  • Bedingung - beschreibt die Überprüfung, die auf Test-String angewendet werden soll
  • [flags] - Zusätzliche Optionen (optional)

[Bearbeiten] Test-String

Test-String ist eine Zeichenkette, die neben gewöhnlichem Text auch folgende Konstrukte beinhalten kann:

Nr. Test-String Erklärung
1. $1 Mit $N (1 <= N <= 9) kann man auf zwischengespeicherte Werte der aktuellen RewriteRule-Direktive zugreifen
2.  %2 Mit %N (1 <= N <= 9) kann man auf zwischengespeicherte Werte der letzten RewriteCond-Direktive zugreifen

[Bearbeiten] Bedingung

Bedingung beschreibt die Bedingung, die auf den Test-String zutreffen muss. Bedingung ist ein Perl-kompatibler Regulärer Ausdruck (ohne Begrenzerzeichen, '/'). Alternativ können folgende Erweiterungen benutzt werden:

Nr. Bedingung Erklärung
1. <Vergleichsstring Der Test-String ist im Alphabet vor dem Vergleichsstring
2. >Vergleichsstring Der Test-String ist im Alphabet nach dem Vergleichsstring
3. =Vergleichsstring Test-String und Vergleichsstring werden auf Gleichheit überprüft. Wenn der Vergleichsstring "" ist, wird geprüft, ob der Test-String leer ist
4. -d Der Test-String wird als Pfadname interpretiert und es wird überprüft, ob es ein Verzeichnis ist (d: directory, Verzeichnis)
5. -f Der Test-String wird als Pfadname interpretiert und es wird überprüft, ob es eine reguläre Datei ist (f: file, Datei)
6. -s DerTest-String wird als Pfadname interpretiert und es wird überprüft, ob es eine reguläre Datei mit einen Inhalt größer als 0 ist (s: size, Größe)
7. -l Der Test-String wird als Pfadname interpretiert und es wird überprüft, ob es ein symbolischer Link ist (l: link, Verknüpfung)
8. -F Der Test-String wird als Pfadname interpretiert und es wird überprüft, ob es eine Datei ist und diese zugänglich ist (inklusive Zugangskontrollen, z.B. mit .htaccess)
9. -U Es wird überprüft, ob Test-String eine gültige URL ist (inklusive Zugangskontrollen, z.B. mit .htaccess)
Beachten Sie: Allen diesen Ausdrücken kann ein Ausrufezeichen ( ! ) vorangestellt werden, um die Ausdrücke zu verneinen. Bei den Beispielen (8.-9.) wird ein interner Aufruf auf diese Datei gestartet, deshalb verschlechtern diese Optionen die Server-Performance sehr stark.


[Bearbeiten] Flags

Die Angabe von flags ist optional. Damit kann man das Verhalten der RewriteCond beeinflussen. Erlaubt sind folgende Werte:

Nr. flag Alternative Erklärung
1. NC nocase Bei String-Vergleichen wird nicht mehr zwischen Groß- und Kleinschreibung unterschieden
2. OR ornext Mit diesem Flag wird die aktuelle Bedingung mit einem logischen ODER mit der nächsten Bedingung verknüpft (Standard ist eine UND-Verknüpfung), das heißt, es braucht nur eine der beiden Bedingungen zuzutreffen.
Beachten Sie: Sie können mehrere Flags verwenden, indem Sie diese mit einem Komma (,) trennen.

[Bearbeiten] RewriteEngine - mod_rewrite ein- und ausschalten

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden:

Mit dieser Direktive schalten Sie mod_rewrite ein. Wenn Sie RewriteEngine auf off stellen, können Sie mod_rewrite nicht benutzen.

Beispiel
RewriteEngine on

Mit dieser Zeile wird der Webserver angewiesen, mod_rewrite einzuschalten.

[Bearbeiten] RewriteLog - Log-Datei für mod_rewrite bestimmen

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden:

Mit RewriteLog setzen Sie den Namen der Datei, in die mod_rewrite seine Logmeldungen schreibt. Wenn Dateipfad nicht mit einem "/" beginnt, dann wird die Datei relativ zu der Umgebungsvariable ServerRoot gesucht. Diese Anweisung sollte nur einmal in der Server-Konfiguration notiert werden.

Beachten Sie folgenden Sicherheitshinweis: Sorgen Sie dafür, dass das Verzeichnis, in dem die Log-Datei liegt, nur vom Benutzer, der den Server startet, beschrieben werden kann. Die Apache Security Tips geben Ihnen dazu Hinweise.

[Bearbeiten] RewriteLogLevel - Art der Log-Meldungen bestimmen

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden:

Mit dieser Direktive können Sie angeben, welche Aktionen mod_rewrite protokolliert. Erlaubte Werte für Log-Level sind natürliche Zahlen. Standardmäßig ist RewriteLogLevel auf 0 eingestellt, was bewirkt, dass Apache keine Aktionen von mod_rewrite protokolliert. Ein Wert von 1 bedeutet, dass nur sehr signifikante Meldungen protokolliert werden. Je höher der Wert, desto mehr Meldungen werden ins Protokoll aufgenommen.

Beispiel
RewriteLog "/var/www/mod_rewrite.log" RewriteLogLevel 2

Bei diesem Beispiel wird mod_rewrite angewiesen, Log-Meldungen in die Datei "/var/www/mod_rewrite.log" zu schreiben. Weiterhin wird festgelegt, welche Meldungen protokolliert werden.

Beachten Sie: Benutzen Sie Werte für Log-Level größer als 2 nur für Debugging-Zwecke, da es den Apache deutlich verlangsamt.

[Bearbeiten] RewriteRule - Umleitungen bestimmen

RewriteRule definiert die eigentliche Umleitung. Sie kann mehrmals vorkommen, dabei ergibt jedes Vorkommnis eine eigene Umleitung. Die Reihenfolge der Umleitungen ist wichtig, da diese in der Reihenfolge ihres Vorkommens angewendet werden.

Erwartet als Parameter:

  • Ausdruck - beschreibt die URLs, die umgeleitet werden sollen
  • Umleitung - gibt die Umleitung an

[Bearbeiten] Ausdruck

Ausdruck beschreibt die URLs, die umgeleitet werden. Es ist ein Perl-kompatibler Regulärer Ausdruck (ohne Begrenzerzeichen, '/'). Vor dem Ausdruck kann zusätzlich ein Ausrufezeichen ('!') stehen, um den Regulären Ausdruck zu negieren.

[Bearbeiten] Umleitung

Umleitung ist die URL, auf die umgeleitet wird, wenn der Ausdruck zutrifft. Neben normalem Text können Sie die gleichen Ausdrücke verwenden, die Sie auch in Test-Strings von RewriteCond-Direktiven benutzen können. Wenn Sie auf Server-Ebene konfigurieren, dann wird die komplette URL ersetzt, auf Verzeichnis-Ebene (in .htaccess bzw. in einem Directory-Container in der zentralen Apache-Konfiguration) wird nur der Pfad ab dem aktuellen Verzeichnis ersetzt. Es werden danach noch alle weiteren RewriteRule-Direktiven abgearbeitet, sodass sich die URL nochmals ändern kann. Wenn Sie für Umleitung den String - angeben, dann wird keine Ersetzung durchgeführt.

Am Ende der RewriteRule können Sie noch optional einige weitere Optionen angeben, welche das Verhalten von mod_rewrite steuern, falls die RewriteRule zutrifft. Diese werden in eckigen Klammern ([ bzw. ]) notiert. Wenn Sie mehrere angeben, trennen Sie diese durch Kommata. Folgende Optionen können Sie angeben:

Nr. Option Alternative Erklärung
1. redirect R Apache wird angewiesen, eine externe Umleitung mit dem HTTP-Statuscode 302 durchzuführen. Wollen Sie einen anderen Statuscode senden, dann geben Sie ihn nach einem Gleichheitszeichen nach diesem Flag an. Es gibt einige vordefinierte Namen für einige Statuscodes:
  • temp (302, MOVED TEMPORARILY),
  • permanent (301, MOVED PERMANENTLY) und
  • seeother (303, See Other).
2. forbidden F Sendet sofort den HTTP-Statuscode 403 (FORBIDDEN) an den Browser.
3. gone G Sendet sofort den HTTP-Statuscode 410 (GONE) an den Browser und markiert diese Seite damit als nicht mehr vorhanden.
4. last L Wenn Sie diese Option angeben, wird nach dieser RewriteRule keine weitere mehr ausgeführt.
5. next N Bewirkt, dass die Abarbeitung der RewriteRule-Direktiven abgebrochen und nochmals gestartet wird. Achten Sie darauf, dass Sie mit dieser Regel keine Endlosschleifen erzeugen.
6. chain C Bewirkt, dass die nächste RewriteRule nur ausgewertet wird, falls die aktuelle Regel zutrifft.
7. type= T= Mit dieser Option können Sie einen bestimmten MIME-Typen bestimmen.
8. nosubreq NS Diese Option bewirkt, dass die Regel übersprungen wird, falls der aktuelle Request ein Sub-Request ist.
9. nocase NC Bewirkt, dass bei der Überprüfung auf Gleichheit des Ausdrucks und der URL nicht auf Groß- und Kleinschreibung geachtet wird.
10. qsappend QSA Diese Option müssen Sie angeben, wenn Sie an die Umleitung manuell einen neuen Query-String hängen und den alten dabei nicht komplett ersetzen wollen.
11. noescape NE Standardmäßig werden bestimmte Sonderzeichen von mod_rewrite maskiert. Mit dieser Option schalten Sie dies aus.
12. skip=N S=N Mit dieser Option können Sie die nächsten N RewriteRule-Direktiven überspringen
13. env=VAR:VAL E=VAR:VAL Mit dieser Option können Sie eine Umgebungsvariable erzeugen, hier etwa die Variable VAR mit dem Wert VAL.
14. cookie=NAME:VAL:domain[:lifetime[:path]] CO= Mit dieser Option setzen Sie ein Cookie namens NAME mit dem Wert VAL und Domain als domain. Optional sind die Argumente lifetime (Lebenszeit in Minuten) und path (Pfad des Cookies).
15. proxy P Diese Option sorgt dafür, dass ein Zugriff von dem Apache-Modul mod_proxy aus auf die URL erfolgt. Dazu muss mod_proxy aktiviert und die URL muss valide sein (sie muss unter anderem auf jeden Fall mit http://hostname beginnen).
16. passthrough PT Benutzen Sie diese Option, wenn Sie mehrere URL->Dateinamen-Übersetzer (wie etwa mod_alias und mod_rewrite) zusammen benutzen.
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Schnell‑Index
Mitmachen
Werkzeuge
Spenden
SELFHTML