SELFHTML: Webserver/CGI / Webserver / Umleitungen mit mod_rewrite
Author: Redaktion SELFHTML, selfhtml81@selfhtml.org
Description: Wie Sie URL-Umleitungen mit dem Apache-Modul mod_rewrite realisieren können.
Keywords: SELFHTML, CGI, Web-Server, Webserver, HTTP, Apache, mod_rewrite, URL, Rewrite, Redirect
Date: 2005-11-10T19:31:11+01:00

| # Umleitungen mit mod_rewrite
| Allgemeines - URLs manipulieren mit mod_rewrite RewriteBase - Basis für eine Umleitung definieren RewriteCond - Bedingung für eine Umleitung definieren RewriteEngine - mod_rewrite ein- und ausschalten RewriteLog - Log-Datei für mod_rewrite bestimmen RewriteLogLevel - Art der Log-Meldungen bestimmen RewriteRule - Umleitungen bestimmen

## 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" (siehe URL Rewriting Guide).

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

## RewriteBase - Basis für eine Umleitung definieren

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden: Directory-Container, .htaccess

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

### Erläuterung:

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.

## RewriteCond - Bedingung für eine Umleitung definieren

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden: Serverkonfiguration allgemein, VirtualHost, Directory-Container, .htaccess.

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

Erwartet als Parameter:

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

### 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

### 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` | Der Test-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.

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

## RewriteEngine - mod_rewrite ein- und ausschalten

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden: Serverkonfiguration allgemein, VirtualHost, Directory-Container, .htaccess.

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

### Beispiel:

    RewriteEngine on

### Erläuterung:

Mit dieser Zeile wird der Webserver angewiesen, mod_rewrite einzuschalten.

## RewriteLog - Log-Datei für mod_rewrite bestimmen

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden: Serverkonfiguration allgemein, VirtualHost, aber nicht in Directory-Containern und .htaccess.

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.

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

## RewriteLogLevel - Art der Log-Meldungen bestimmen

Diese Regel darf an folgenden Stellen der Apache-Konfiguration notiert werden: Serverkonfiguration allgemein, VirtualHost, aber nicht in Directory-Containern und .htaccess.

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

### Erläuterung:

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.

## 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:

1. Ausdruck - beschreibt die URLs, die umgeleitet werden sollen
2. Umleitung - gibt die Umleitung an

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

### 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 spitzen 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 Statuscode: 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.

| Andere Webserver
| .htaccess - Server-Reaktionen kontrollieren

© 2007 Impressum