mod_rewrite

mod_rewrite ist der Name eines extrem mächtigen Moduls für den Apache-Webserver. Um die Funktionsweise von mod_rewrite und die nahezu grenzenlosen Einsatzmöglichkeiten zu verstehen, müssen wir zunächst einen Blick darauf werfen, wie ein Webserver wie Apache HTTP-Anfragen beantwortet.

Wird ein Webserver auf einem Rechner gestartet, tut er zunächst mal nichts. Er wartet, bis eine Anfrage von einem HTTP-Client eintrifft. Der Webserver ermittelt aus dieser Anfrage, welches Dokument auszuliefern ist. Dazu benötigt er zwei Angaben: Den Host, von dem das Dokument gewünscht wird und den Pfad auf diesem Host.

Den Host ermittelt Apache aus der Zeile Host: der HTTP-Anfrage, den Pfad aus der Zeile, die mit GET beginnt. (Wenn Sie live mitbekommen möchten, welche Anfragen Ihr Browser sendet und wie ein Webserver antwortet, so können Sie dies mit der Erweiterung Live HTTP Headers für den Firefox verfolgen. Für den Chrome gibt es diese Erweiterung ebenfalls: Live HTTP Headers für Chome.)

mod_rewrite – Übersetzung nach eigenen Regeln

Der Pfad, so wie er in einer URL und damit auch in einer HTTP-Anfrage vorkommt, muss nichts mit dem Pfad auf dem Rechner zu tun haben, auf dem der Webserver läuft. Damit aber der Webserver weiß, welches Dokument er auszuliefern hat, sieht er in seiner Konfigurationsdatei nach; dort ist angegeben, welches Unterverzeichnis im Dateisystem des Rechners für welchen Host zuständig ist.

Exakt an dieser Stelle setzt mod_rewrite an. Das Modul gibt dem Webmaster die Möglichkeit, in diesen Übersetzungsprozess mit eigenen Regeln einzugreifen. Soll die Datei einer Webseite, die bisher index.htm genannt wurde, nun start.html heißen, die Seite aber weiterhin unter index.htm erreichbar bleiben, so hilft diese mod_rewrite-Regel weiter:
RewriteEngine On
RewriteRule ^index\.htm$ start.html

Die erste Zeile dieser Anweisung besagt lediglich, dass das Modul aktiviert werden soll. Die zweite Zeile stellt die eigentliche Übersetzungsregel dar und hat diese Bedeutung: Falls eine Datei angefragt wird, die index.htm heißt, soll statt dessen der Inhalt der Datei start.html ausgegeben werden. Die komischen Zeichen ^, \ und $ sind Teil der regulären Ausdrücke (das sind Regeln für Platzhalter), die mod_rewrite auswerten kann und denen es einen großen Teil seiner Mächtigkeit verdankt.

Wichtig ist zu beachten, dass diese Art der Nutzung von mod_rewrite keine Weiterleitung darstellt: Der HTTP-Client stellt eine Anfrage und bekommt eineAntwort mit dem Statusvermerk „Okay“ zurück. Dass der ausgelieferte Inhalt nicht aus der Datei namens index.htm stammt, ist für Außenstehende nicht ersichtlich. Und natürlich muss auch die angefragte URL auf dem Rechner nicht als Datei existieren.

Zur Anregung für die vielen Einsatzmöglichkeiten von mod_rewrite sei noch dieses Beispiel gegeben:
RewriteEngine On
RewriteRule ^artikel_([0-9]+)\.htm$ show.php?id=$1

Diese Regel trifft immer dann zu, wenn eine Datei angefragt wird, die diese Form besitzt: artikel_1234.htm – wobei die Anzahl der Ziffern zwischen dem Unterstrich und dem Punkt beliebig ist. Kommt also eine Anfrage dieser Art, so wird der Inhalt der Seite show.php?id=1234 ausgeliefert. Die runden Klammern im ersten Teil der Regel sorgen dafür, dass die Variable $1 mit dem Inhalt dieser runden Klammern gefüllt wird. Auf diese Art und Weise können Sie dynamische Inhalte ohne das lästige Fragezeichen in der URL benutzen.

Hier noch ein paar Beispiele für die Auswirkung obiger Ersetzungregel:

angefragte URL ausgelieferter Inhalt
artikel_1.htm show.php?id=1
artikel_877.htm show.php?id=877
artikel_00001.htm show.php?id=00001
artikel_08-15.htm artikel_08-15.htm

In der letzten Zeile findet keine Ersetzung statt, da der Bindestrich in der angefragten URL dafür sorgt, dass die mod_rewrite-Regel hier nicht zutrifft und somit die angeforderte URL ausgeliefert wird – oder eine 404-Fehlermeldung eintritt, falls diese Datei nicht existiert.

weiterer Lesestoff:
offizielle Apache Dokumentation zu mod_rewrite