RewriteRule, RewriteCond und Reguläre Ausdrücke


Mit RewriteRule kann man die Rewrite-Engine des Softwaremoduls mod_rewrite des Apache-Webservers bedienen, also Anfragen an den Webserver intern umschreiben oder weiterleiten.

Somit können wir mit Rewrite Regeln wunderbar Weiterleitungen einrichten oder dynamische URLs unter statischen Adressen erreichbar machen.

Voraussetzung: Wir haben einen Apache Webserver mit installierten mod_rewrite Modul. Wir legen im Hauptverzeichnis der Domain eine Textdatei Namens .htacces an und fügen darin folgenden Text ein:

RewriteEngine On
ab hier zeilenweise die gewünschten Rewrite Bedingungen bzw. Rewrite Regeln einfügen...

RewriteRule

Allgemeine Syntax von RewriteRule:

RewriteRule Argument1 Argument2 [spezielle Angaben]

RewriteRule ist die Anweisung, Argument1 die vom Besucher aufgerufene URL, Argument2 die URL zu der der Webserver intern unsichtbar für den Besucher weiterleitet bzw. umschreibt.

Argument1 wird oft als regulärer Ausdruck angeführt, wobei ^ den regulären Ausdruck einleitet und $ ihn beendet.

RewriteRule-Beispiel: einfache Weiterleitung:

RewriteRule ^/seite1.html$ http://www.anderedomain.tld/seite2.html [R=301,L]

Ruft ein Besucher die URL http://www.domain.tld/seite1.html auf, so wird er automatisch zu http://www.anderedomain.tld/seite2.html weitergeleitet. Die Angabe R=301 gibt an, dass eine 301 Weiterleitung (permanente Weiterleitung) genutzt werden soll, das L (last rule) gibt an, dass es sich um die letzte Anweisung bzw. Regel handelt. Nachfolgende Anweisungen bzw. Regeln werden nicht berücksichtigt.

RewriteRule-Beispiel: einfache Umschreibung:

RewriteRule ^(.*)\.html$ /index.php?produkt=$1 [QSA,L]

Mit dieser Rewrite Regel wird die dynamischen URL http://www.domain.tld/index.php?produkt=auto als statische Adresse in der Form auto.html verfügbar gemacht d.h. der Besucher kann http://www.domain.tld/auto.html in der Adressleiste eintippen, der Webserver wandelt die statische Adresse intern, unsichtbar für den Besucher, in die dynamische URL http://www.domain.tld/index.php?produkt=auto um.

Innerhalb von regulären Ausdrücken steht der Punkt für ein beliebiges Zeichen, außer für Zeilenumbrüche. Das * Zeichen gibt an, dass das vorige Zeichen keinmal oder beliebig oft vorkommen kann. Der Ausdruck .* steht also für eine beliebige Zeichenfolge.

Die runde Klammerpaar kennzeichnet einen Platzhalter in der aufgerufenen URL, der in der umgeschriebenen URL mittels $1 eingefügt werden kann. Gibt es mehrere Platzhalter so werden sie von links nach rechts durchgezählt und können mit $2, $3 usw. eingefügt werden.

QSA (appaned query string) wird benötigt, damit ein eventuell der statischen Adresse zusätzlich angehängter Query String, der umgeschriebenen URL auch angehängt wird. Damit wird ein Aufruf von http://www.domain.tld/auto.html?marke=mercedes in die URL http://www.domain.tld/index.php?produkt=auto&marke=mercedes umgeschrieben.

RewriteCond

Nehmen wir zusätzlich zu den Rewrite Regeln die Rewrite Bedingungen hinzu, dann erhalten wir ein sehr mächtiges Werkzeug der URL Umschreibung.

Mit RewriteCond definieren wir eine Bedingung, von der abhängig gemacht wird, ob die folgende ReWriteRule Regel ausgeführt wird oder nicht. Die allgemeine Syntax lautet:

RewriteCond Argument1 Argument2

RewriteCond ist die Anweisung, Argument1 der Text der mit dem Text Argument2 verglichen werden soll. Argument1 kann neben normalem Text Servervariabeln wie z.B. HTTP_USER_AGENT, HTTP_HOST oder REQUEST_FILENAME enthalten. Argument2 wird oft als regulärer Ausdruck oder in Form von speziellen Flags angeführt.

RewriteCond-Beispiele:

RewriteCond %{HTTP_HOST} ^www\.domain\.tld$

%{HTTP_HOST} steht für die Servervariable HTTP_HOST, welche den übertragenen Domainnamen enthält.

^www\.hauptdomain\.tld$ steht für den regulären Ausdruck der www.domain.tld maskiert. Das ^Zeichen steht für den Beginn, das $ Zeichen für Ende des regulären Ausdruckes. Das \ Zeichen wird benötigt, damit der Punkt als normales Textzeichen und nicht als Sonderzeichen des regulären Ausdruckes verwendet wird.

Die angeführte Bedingung bedeutet also: wenn die per http übertragene Domain gleich www.domain.tld ist dann…

RewriteCond %{HTTP_HOST} !^ww\.domain\.tld$

Wenn die per http übertragene Domain ungleich www.domain.tld ist dann…

Ein Rufzeichen negiert also den Vergleichstext.

Als Argument2 kann man anstatt regulärer Ausdrücke auch spezielle Flags setzten z.B. –d oder –f

RewriteCond %{REQUEST_FILENAME} -d

Wenn der per http übertragene Dateiname gleich einem existierenden Verzeichnis dann..

RewriteCond %{REQUEST_FILENAME} -f

Wenn der per http übertragene Dateiname gleich einem existierenden Dateinamen dann..

Beispiele RewriteCond und RewriteRule:

Alle nicht existierenden URLs umleiten:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ http://www.zieldomain.tld/$1 [R=301,L]

, , , , , ,

  1. #1 von kojak2008 am Januar 27, 2011 - 11:03

    Hallo Webmaster,

    ich bin auf der Suche nach einer Möglichkeit, das ich die Domain behalte die ich ursprünglich in die Adressleiste eingegeben habe, wenn diese zu einer anderen Domain ungeleitet wird.

    Weis da irgendjemand rat?
    Geht das überhaupt, weil ich nicht fündig werde.

    Also 3 Domainnamen leiten alle auf eine Domain und die eingegebene Adresse soll in der Adressleiste bleiben.. !??!?!?!

    Viele Grüße
    kojak

  2. #2 von Webmaster am Februar 13, 2011 - 9:40

    Benutze einfach ein Frameset. Doku: http://de.selfhtml.org/html/frames/index.htm
    Grüße

  3. #3 von Alex am Februar 18, 2011 - 12:38

    Hallo,

    wenn ich jetzt folgendes stehen habe:

    RewriteEngine on

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

    Wird dann also $1 immer durch (.*) ersetzt? Sprich, wenn ich domain.de/xyz aufrufe werde ich zu http://www.domaind.de/blog/xyz weitergeleitet?

  4. #4 von Webmaster am Februar 21, 2011 - 9:30

    Ja, aber das Ganze könnte eine Endlosschleife produzieren, wenn du im Verzeichnis xyz die RewriteEngine nicht abschaltest…

    Eventuell:
    RewriteCond %{HTTP_HOST} ^www\.domain\.de$
    RewriteRule ^$ http://www.domain.de/blog/$1 R=301,L]

    probieren.

  5. #5 von Michael Buchholz am Dezember 9, 2011 - 10:58

    Hallo auch…

    …und erstmal vielen Dank für dieses super Howto! Das hat mir schon eine Ecke weitergeholfen, aber die Lösung habe ich leider immer noch nicht ^^

    Basis ist ein vHost mit zwei Domänen like:
    ServerName dom1.de
    ServerAlias dom2.de
    ServerAlias http://www.com1.de
    ServerAlias http://www.dom2.de

    Ich möchte jetzt folgendes erreichen:
    1. Bei Aufruf eines der drei ServerAlias’es soll immer auf dom1.de umgeleitet werden
    2. Egal, was ich hinten noch an die TLD dran hänge und ob das wirklich existiert oder nicht, soll immer auf Root umgeleitet werden

    Option 1 funktioniert so weit schmerzfrei, auch wenn ich irgend etwas hinten dran hänge, wie z.B. “www.dom2.de/blabla/blub.htm”. Das landet erwartungsgemäss immer auf “dom1.de”
    Wenn ich jetzt aber direkt z.B. “dom1.de/bla/blub.htm” aufrufe, glotzt mich ein böser 404 an *grummel*

    Meine aktuelle Anweisung lautet wie folgt, wobei ich natürlich auch schon die Reihenfolge der Conditions umgestellt hatte:

    RewriteCond %{HTTP_HOST} !^dom1\.de$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ http://dom1.de/$1 [R=301,L,DPI]

    Irgendwie laufe ich da immer vor die Wand oder sehe den berüchtigten Wald nicht ^^

    Ich weiss natürlich, das dieses Festtackern auf die Startseite im Normalfall wohl nie vorkommt, habe aber gerade genau solch eine Aufgabe, die einmal innert 24h für ca. 3-6 Minuten erforderlich ist.

    Wäre echt schugga, wenn ich hier mal genordet werden könnte ;)

    DLzG
    Micha

  6. #6 von Michael Buchholz am Dezember 9, 2011 - 11:00

    Huppala… http://www.com1.de soll natürlich http://www.dom1.de heissen… hier fehlt ein Edit ;)

  7. #7 von Daniel am Februar 7, 2012 - 10:34

    Super Artikel und sehr gut erklärt. Danke!

  8. #8 von Yannick am März 3, 2012 - 12:48

    Ich möchte eine einfache Umleitug von z.B.:
    http://www.bsp.de/produkte nach http://www.bsp.de/produkte.php einrichten.
    Dafür verwende ich folgenden Code:
    RewriteRule ^/([^\.]+)$ /$1.php [QSA]

    Aber es funktioniert nicht!

  9. #9 von Christoph am März 23, 2012 - 5:20

    Danke,

    erste für einen Anfänger hilfreiche Erklärung zu dem Thema.

  10. #10 von Micha am Mai 7, 2012 - 11:50

    @Yannick:
    Mache es am besten so:
    RewriteRule ^([-a-z0-9]+)$ /$1.php

(wird nicht veröffentlicht)