Webserver/htaccess/Umleitungen mit mod rewrite

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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.

301-Icon.svg

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

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.

Beispiel
RewriteEngine on
Beachten Sie: Sie benötigen diese Anweisung nur einmal in ihrer .htaccess-Datei.


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

Hier sind einige Beispiele für Umleitungen, die Sie anpassen und in Ihre .htaccess kopieren können:

Weiterleitung von einzelnen Seiten oder URLs

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

Umleitung von www auf non-www
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.

Umleitung von http auf https
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

Umleitung auf neue Domain
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:

Umleitung auf Startseite der neuen Domain
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:
  • 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.


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.

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.

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)

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

RewriteLog - Log-Datei für mod_rewrite bestimmen

Achtung!

Deprecated :

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.

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.