Webserver/htaccess/Umleitungen mit mod rewrite
- 30min
- mittel
- Grundkenntnisse in
- Domain Name System
- Webserver
Ursprünglich bestand die URL, mit der man eine Webseite aufrufen konnte, aus dem Domain Namen, dem Verzeichnis und dem Namen des HTML-Dokuments. Mittlerweile werden viele Seiten direkt aus Datenbanken erzeugt.
In diesem Tutorial lernen Sie, wie Sie sprechende URLs erzeugen, die Ihre Seitenbesucher schnell über den Inhalt der Webseite informieren und von Suchmaschinen höher bewertet werden. Dies erreichen wir mit dem mod_rewrite-Modul, mit dem Webseiten z. B. auf eine andere URL umgeleitet werden.
Inhaltsverzeichnis
Das Modul können Sie mit Hilfe der LoadModule-Anweisung in Ihrer httpd.conf aktivieren.
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.
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.
RewriteEngine - mod_rewrite ein- und ausschalten
Mit dieser Direktive schalten Sie mod_rewrite
ein. Wenn Sie RewriteEngine
auf off
stellen, können Sie mod_rewrite
nicht benutzen.
RewriteEngine on
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
Es ist ein Regulärer Ausdruck (ohne Begrenzerzeichen, '/'). Vor dem Ausdruck kann zusätzlich ein Ausrufezeichen ('!') stehen, um den Regulären Ausdruck zu negieren. - Umleitung – gibt die Umleitung an, 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 weiterenRewriteRule
-Direktiven abgearbeitet, sodass sich die URL nochmals ändern kann. Wenn Sie für Umleitung den String-
angeben, dann wird keine Ersetzung durchgeführt.
Hier sind einige Beispiele für Umleitungen, die Sie anpassen und in Ihre .htaccess kopieren können:
Weiterleitung von einzelnen Seiten oder URLs
RewriteEngine On
Redirect 301 /alter-pfad/ https://www.example.com/neuer-pfad/
Achten Sie hierbei auf die richtigen Statuscodes:
- 301: Die Weiterleitung ist dauerhaft, z. B. weil die Seitenstruktur umgestellt wurde. Suchmaschinen übernehmen nach dem Crawlen dann die neue URl und zeigen diese nach einigen Tagen in den Suchergebnissen an.
- 302: Die Weiterleitung erfolgt nur vorübergehend, anschließend gilt wieder die bisherige Adresse.
Umleitung von www auf non-www
So können Sie Ihre URLs ohne das www vor dem Domainnamen darstellen.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Umleitung von http auf https
Alte Links können noch auf http-Ressourcen verlinken. Sie werden automatisch auf das sichere HTTPS-Protokoll umgeleitet.
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
Mit RewriteCond
werden alle Aufrufe, die nicht über Port 443 (HTTPS) gehen, ausgewählt und mit RewriteRule
per 301er-Weiterleitung an die entsprechende HTTPS-Seite weitergeleitet.
Umleitung auf eine neue Domain
Bei einem Seitenumzug sollen Benutzer (und Suchmaschinen) auf die neue URL umgeleitet werden. So erhalten Sie das Suchmaschinen-Ranking
RewriteEngine On
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ http://neue-domain.tld/$1 [L,R=301]
Wenn sich aber die Seiten- und Verzeichnisstruktur ändert, ist es sinnvoller alle Requests auf die neue Startseite umzuleiten:
RewriteEngine On
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ http://www.neue-domain.tld/ [L,R=301]
Nach dem Domainnamen wird der Reguläre Ausdruck $1
entfernt, sodass alle Requests auf die Startseite geleitet werden.
optionale Parameter
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:
|
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.
|
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 seinen 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.
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.
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:
Test-String
– eine Zeichenkette, die überprüft werden sollBedingung
– beschreibt die Überprüfung, die aufTest-String
angewendet werden soll[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 |
4. | %{REQUEST_URI} | Mit %{name} kann man auf eine Umgebungsvariable name von Apache 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)
|
!
) 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. |
RewriteLog - Log-Datei für mod_rewrite bestimmen
Achtung!
aktuelle Versionen von apache2 erlauben die RewriteLog-Direktive nicht mehr. Hier ist LogLevel warn rewrite:trace8
zu verwenden.Mit RewriteLog konnten Sie den Namen der Datei setzen, 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.