Mod_Rewrite Snippets & Referenz

Mit Mod_Rewrite können Webserver Anfragen intern umgeschrieben bzw. extern umgeleitet werden. Insbesondere zur Vermeidung von doppelten Inhalten, Domain- & URL Umstellungen (Backlinkübertragung via 301 Redirect, Indexaktualisierung, Besucher Weiterleitung auf die neue Seite), www. Umleitungen, Errichtung einer Wartungsseite und vielen weiteren Anliegen kommt Mod_Rewrite zum Einsatz. In diesem Artikel findest du einige Snipptes für die häufigsten Anwendungsfälle und kannst dir an Hand der Beispiele mit geringer Modifikation, schnell die passenden eigenen RewriteRules schreiben. Möchtes du eine Reihe von alten URLs auf die jeweils passende neue URL umleiten, empfehle ich dir den kostenlosen Mod_Rewrite Generator, welcher URI & Query URLs korrekt behandelt.

Grundlage für den Mod_Rewrite Einsatz

Damit die Mod_Rewrite Regeln greifen, muss auf dem Apache Webserver das Mod_Rewrite Modul aktiviert sein. Dies ist bei wahrscheinlich über 95 % der Webhoster mittlerweile standardmäßig der Fall. Hierzu wird im sogenannten Document Root der Domain (Rootverzeichnis der Domain – meist ein Verzeichnis namens html, htdocs o.ä.) eine .htaccess Datei angelegt, welche in der ersten Zeile die RewriteEngine aktiviert.

RewriteEngine On

Auskommentieren von Regeln

Um eine Regel auszukommentieren nutzt man das Raute Zeichen (#).

#RewriteRule .* /index.php [L]

WWW Umleitung

Hier wird über eine Rewrite Condition abgefragt, ob der Hostname am Anfang ein www. enthält. Ist dies nicht der Fall wird per 301 Redirect (HTTP Status permanente Weiterleitung) auf die www. Variante umgeleitet. Das L bedeutet, dass hiernach keine weiteren Mod_Rewrite Rules berücksichtigt werden. Sprich die Umleitung direkt durchgeführt wird. Das Hochdach (^) und das Dollarzeichen am Ende ($) definieren den Anfang und Ende der Zeichenkette.

RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Trailing Slash Umleitung

Bei der Trailing Slash Umleitung wird geschaut ob man Ende der URL ein Slash (/) gesetzt ist. Ist dies nicht der Fall wird die URL auf die Variante mit Trailing Slash umgeleitet. Hierbei sichert die erste Rewrite Condition, dass die Regel nicht greift, wenn auf eine Datei z.B CSS, JS oder Image Files verwiesen wird. Hinweis: In Apache Apache 2.2 gibt es ein Escape Parameter Fehler in Verbindung mit den Query Parametern bei einer Umleitung. Daher muss hier ein NE Flag (no escape) gesetzt werden. Ab Apache 2.4 besteht das Problem nicht mehr.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://example.com/$1/ [R=301,L,NE]

Domain Änderung bei gleichbleibenden Pfaden

Hierbei wird geprfüt ob der Hostname der alten Domain entspricht und bei Zutreffen auf die neue Domain inkl. aktuell aufgerufenen Pfad per 301 Redirect umgeleitet. Durch das ausbleibende vorangestellte Hochdach (^) im Vergleich zur WWW Umleitung trifft diese Regel sowohl bei www., als auch bei jeglichen Subdomains des alten Hostnames zu.

RewriteCond %{HTTP_HOST} old-example\.com$
RewriteRule ^(.*)$ http://www.new-example.com/$1 [R=301,L]

URL mit Verzeichnispfad umleiten (URI Umleitung)

RewriteRule ^alte-seite.php$ http://www.example.com/neue-seite.php [L,R=301]

Alternativ kann man hier ebenso mit einer URI Condition arbeiten:

RewriteCond %{REQUEST_URI} alte-seite.php$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/neue-seite.php [L,R=301]

URL mit Query Strings umleiten (GET Parameter Umleitung)

Möchte man get Parameter umleiten, müssen diese über %{QUERY_STRING} abgefragt werden.

RewriteCond %{QUERY_STRING} ^site=index$
RewriteRule index.php$ http://www.example.com/index.php? [L,R=301]

Das Fragezeichen hinter der neuen URL sorgt dafür, dass die GET Parameter nicht erneut hinter der neuen URL angefügt werden.

Möchte man auf die in Query String eingeklammerten Werte zugreifen nutzt man %1, %2 und so weiter.

RewriteCond %{QUERY_STRING} ^site=(.+)$
RewriteRule index.php$ http://www.example.com/%1.php? [L,R=301]

Sollen die Rewrites nicht nur für Query Parameter gelten, welche an die index.php übergeben werden, kann man Folgendes nutzen:

RewriteCond %{QUERY_STRING} ^site=(.+)$
RewriteRule .* http://www.example.com/%1.php? [L,R=301]

http auf https umleiten

Allgemeine Prüfung ob https im Protokoll genutzt wird

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Alternative Prüfung auf Basis des SSL Ports:

Wenn der Server Port nicht 443 (SSL) entspricht, wird auf die https Variante umgeleitet.

RewriteCond %{SERVER_PORT} !443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Möchte man nur bestimmte Seiten z.B. die Loginseite auf die HTTPS Variante umleiten, so kann man folgendes Snippet nutzen:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !login/
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} login/
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Hierbei werden alle anderen Seiten auf die HTTP Variante umgeleitet und die Loginseite auf die HTTPS Version.

Wartungsseiten Umleitung

RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ http://example.com/maintenance.html [R=307,L]

Der 307 Redirect steht für einen Temporary Redirect und besagt, dass die angeforderte Ressource vorübergehend unter der im „Location“-Header-Feld angegebenen Adresse bereit steht, die alte Adresse jedoch Gültigkeit behält. Auf der Wartungsseite selbst, sollte dann der Status Code 503 Service Temporarily Unavailable ausgegeben werden.

header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');

IP Zugriffe sperren

Durch das [F] Flag wird ein 403 Forbidden Status zurückgegeben.

RewriteCond %{REMOTE_ADDR} ^89\.123\.321\.123$
RewriteRule .* - [F]

Möchte man mehrere IP Adresse sperren, können diese mit einem OR verknüpft werden. Standardmäßig werden mehrere Rewrite Conditions via UND verknüpft.

RewriteCond %{REMOTE_ADDR} ^89\.123\.321\.123$ [OR]
RewriteCond %{REMOTE_ADDR} ^89\.124\.421\.124$
RewriteRule .* - [F]

Referrer Zugriffe sperren

Gerade wenn man bestimmte Spam Zugriffe Seitenweit aus allen Analysewerkzeugen fernhalten möchte, ist ein Sperrung bestimmter Referrer sinnvoll. Siehe auch den Artikel zum Thema Semalt Referrer Spam in Google Analytics. Der NC Parameter besagt hier, dass nicht auf Groß- und Kleinschreibung geachtet wird.

RewriteCond %{HTTP_REFERER} semalt\.com [NC]
RewriteRule .* - [F]

Alle Anfragen intern auf die index.php routen

Diese Methode kommt häufig in PHP MVC Frameworks zum Einsatz um die Controller und Action Verwaltung abzubilden. Hierbei erfolgt keine Weiterleitung der Nutzer auf die index.php. Die Anfragen laufen intern aber immer auf die index.php.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php [L]

Kurze Erklärung der gängigsten RewriteCond %{REQUEST_FILENAME} Parameter:

  • -f bezieht sich auf existierende Dateien
  • -d auf existierende Ordner
  • -l auf symbolische Links
  • und -s auf Dateien größer 0 bytes (kommt hier jedoch nicht zum Einsatz)

Alle .html Aufrufe intern auf eine .php Datei routen

RewriteRule ^(.*).html$ $1.php

Aus site.php?id=10 wird site_10.html

RewriteRule ^site_([0-9]+).html$ site.php?id=$1

Bei einem bestimmten Cookie Wert umleiten

RewriteCond %{HTTP_COOKIE} !^.*cookiename=cookievalue.*$ [NC]
RewriteRule .* intern/index.php [L]
Suchmaschinenoptimierung (SEO) Beratung & Statistiken »Statistiken, Maßnahmen & Google Updates zur Suchmaschinenoptimierung in der Übersicht. Kostenlose Erstberatung zur Suchmaschinenoptimierung vom erfahrenen SEO-Experten mit über 9 Jahren Erfahrung.

ELEXPRESS.de Tipp: Kostenlose Online Marketing Tools wie z.B. ein Google Adwords Keyword Generator, ein SEO Webseiten Quick-Test inkl. Besucher Prognose, Social Signals Check oder auch Mod_Rewrite Generator z.B. für 301 Redirects und Keyword Density & Text Analyse Werkzeug.

8 Kommentare
  1. Hi, vielen Dank für die tolle Übersicht! Was ich bisher erfolglos versuche: Wie wäre der Code, um eine Subdomain auf einen Ordner der URL umzuleiten?
    Mit Dank und Grüßen,
    Marcus

  2. Dominik

    11. Februar 2015

    Hi Markus,
    es ist im Prinzip nichts anderes als die WWW. Umleitung, die ja auch einer Subdomain entspricht.

    RewriteCond %{HTTP_HOST} ^sub\.example\.com$
    RewriteRule .* http://www.example.com/neueseite [R=301,L]

    Einziger Unterschied – die Negation durch das Ausrufezeichen fliegt raus, da man ja die Subdomain umleiten möchte.

  3. Hi Dominik,

    vielen Dank für Deine schnelle Antwort! Im Prinzip funktioniert es, nur dass aus irgendeinem Grund ganz zum Schluss dann doch die Subdomain wieder aufgerufen wird. Eigentlich dürfte das doch aber nicht gehen, oder müsste zumindest in einer Schleife gefangen sein. Das muss ich mir mal in Ruhe anschauen.

    Viele Grüße,
    Marcus

  4. Dominik

    11. Februar 2015

    Hi Markus,
    dann scheint es noch eine ModRewrite Regel in der .htaccess zu geben, welche die Umleitung auf die Subdomain durchführt. Fernab der .htaccess kann es ansonsten ggf. auch eine Umleitung durch das CMS sein.

    Wenn man die Requests kurz verfolgen mag, ist das Firefox Addon HttpFox ideal hierzu: https://addons.mozilla.org/de/firefox/addon/httpfox/

  5. Hi Dominik,

    ja, den Fox habe ich das schon protokollieren lassen, da springt die URL einfach um – abgesehen davon, dass wahnsinnig viele redirects drin sind und nicht nur einer…. wird wahrscheinlich irgendwie mit WordPress zusammenhängen.

  6. Dominik

    11. Februar 2015

    Hi,
    eigentlich ist WordPress hier ziemlich vorbildlich aufgestellt. Sehr viele Redirects sollte es nicht geben. Ich würde einmal die .htaccess mit der Standard .htaccess von WordPress abgleichen. Ansonsten ist es schwer aus der Ferne zu helfen.

  7. Ich werde am Abend mal ein bisschen basteln und hoffe Dir dann die Lösung sagen zu können – vielen Dank auf jeden Fall für Deine Hilfe!

    VG Marcus

  8. Super strukturierte Übersicht mit vielen nützlichen Informationen!

    Die ModRewrite Funktion ist ein mächtiges Tool, das die meisten Seitenbetreiber nur vom Hörensagen kennen. Die Einsatzmöglichekeiten gehen auch weit über das Thema einfach „schöne URLs“ zu haben hinaus. Das Beste ist, dass man sogar auf einem einfachen Webspace Paket damit arbeiten kann und kein eigener Server dafür notwendig ist.

    Gruß Marco

Die Kommentare sind geschlossen.