Anleitung zu Mod_Rewrite
Was ist mod_rewrite?
Mod_rewrite ist ein Modul des Apache Webservers, welches standardmäßig nicht aktiviert ist. Die meisten Provider schalten es aber bei Bedarf frei. Das Modul mod_rewrite ist vielseitig einsetzbar, besonders mächtig ist es auch im Zusammenhang mit der Suchmaschinenoptimierung. Auf diesen Bereich wollen wir uns hier auch beschränken.
Die Frage, die in unserem Forum mit am häufigsten gestellt wird, ist die nach der Suchmaschinenfreundlichkeit der eigenen, mittels PHP, Perl etc. realisierten Seiten.
Diese Seiten sind natürlich leichter zu administrieren als jene, die in puren HTML von Hand gepflegt werden. Nur werden Seiten in der Form von nur-ein-test,kategorie,5.html besser von den Bots verarbeitet als kategorie.php?kategorieid=5&text=nur%20ein%20test.
Wie kann man diesen Aufbau mittels mod_rewrite nun erzeugen?
Als erstes müssen die "Dateien" aus der Datenbank gelesen werden. Dies geschieht bereits bei vielen CM-Systemen bzw. bei Foren. In der Datenbank stehen als Beispiel folgende Werte:
| ID (Autowert) | Titel |
| 1 | Produktübersicht |
| 2 | Dienstleistungen |
| 3 | Impressum |
Auf die Inhalte wird hier aus Gründen der Übersichtlichkeit verzichtet.
Nun werden alle Informationen aus der Tabelle ausgelesen. Dies stellt meist kein Hindernis dar.
Nun bedienen wir uns einer Funktion, die aus dem Titel einen Dateinamen generiert.
function make_html_file($word)
{
$word = strtolower($word);
$word = str_replace("ä","ae",$word);
$word = str_replace("ö","oe",$word);
$word = str_replace("ü","ue",$word);
$word = str_replace(" ","-",$word);
$word = str_replace("ß","ss",$word);
return $word;
}
Wofür diese Funktion?
Nun, sie wandelt alle Buchstaben in Kleinbuchstaben um. Anschließend werden alle Umlaute (ä,ü,ö) in ae, ue und oe umgewandelt. Vorhandene Leerzeichen werden durch einen "-" ersetzt. Zum Schluß gibt die Funktion den Dateinamen zurück.
Beispiel:
Aus "Produktübersicht" wird "produktuebersicht"
Aus "mod_rewrite Tutorial" wird "mod_rewrite-tutorial"
Dies ist aber noch nicht alles. Nun haben wir zwar den Titel umgewandelt, aber das wichtigste fehlt bei unserem Beispiel noch. Denn egal welchen Modus wir nun versuchen, wir haben noch keinen eindeutigen Wert damit die Seiten auch einem Inhalt in der Datenbank zugewiesen bekommen. Daher wird beim auslesen der Daten aus der Datenbank folgender Funktionsaufruf getätigt:
$html_file=make_html_file("$row[titel]),$row[id].html");
$row[] ist hierbei das Array mit den Datensätzen. Diese Aufruf würde aus dem ersten Datenbank eintrag folgendes machen:
produktuebersicht,1.html
Ob nun als Trenner für die ID ein Komma, Strich, Unterstrich oder Slash verwendet wird, ist dabei nicht von großem Interesse.
Nun stehen statt kategorie.php?id=1 die Datei produktuebersicht,1.html an dessen Stelle. Nur funktioniert das ganze zur Zeit noch nicht, da keine Datei mit dem Namen produktuebersicht,1.html auf dem Server existiert. Und genau dafür benötigen wir nun das Modul mod_rewrite.
Als erstes legen wir eine .htaccess Datei an. Dies wird unter Windows unter Umständen fehlschlagen, da das System einem den "leeren" Dateinamen verbietet. Behelfsweise kann hierzu vorerst eine normale Textdatei genommen werden, welche dann später auf dem Server umbenannt wird.
In diese Datei schreiben wir folgenden Inhalt:
DirectoryIndex produktuebersicht,1.html
RewriteEngine On
RewriteRule ^(.*),(.*).html$ /inhalt.php?id=$2 [L]
Nach dem Hochladen wird man feststellen, dass es mit dem Dateiaufruf nun funktioniert, obwohl gar keine "echten" HTML-Dateien auf dem Server liegen. So weit, so gut. Doch warum? Die 3 Zeilen bedeuten im einzelnen:
DirectoryIndex = Welche Datei soll die Startdatei sein. Normalerweise ist dies die index.htm, index.html oder index.php (bzw home.htm oder default.htm). Wird diese Zeile nicht angegeben kommt es zu einem Serverfehler. Diesen könnte man zwar umgehen, das wird aber meist nicht benötigt.
RewriteEngine On = Hiermit schalten wir das Modul ein. Der Apache weiß nun, dass hier ein spezielles Modul geladen werden muss.
RewriteRule ^(.*),(.*).html$ inhalt.php?id=$2 [L]
Die RewriteRule ist die Regel, die für das Verzeichnis angewendet werden soll.
^(.*),(.*).html$ beschreibt das Muster der Regel. Alles was in der Form von "xxx,xxx.html" existiert wird dabei beachtet.
inhalt.php?id=$2 Hier beschreibt man für den Webserver, wie er mit dem Muster verfahren soll. Alles, was auf das Muster zutrifft, soll er an die inhalt.php weiterleiten mit der Variable id. Warum die $2? Ganz einfach. Wir haben 2 Platzhalter im Muster (.*),(.*). Platzhalter 1 wird nicht benötigt da es nur der Titel ist, Platzhalter 2 enthält die ID die in der Tabelle steht. Diese ID wird an die inhalt.php übergeben.
Nicht vergessen, diese mittels $_GET[id] zu holen!
Das [L] steht für LAST. Also die Letzte Regel die der Apache beachten muss.
Die inhalt.php holt sich nun die Variable ID und sucht sich dafür aus der Datenbank den Inhalt.
WICHTIG! Alle .htaccess Regeln, egal welcher Art, wirken sich auf alle Unterverzeichnisse aus.
Beispiel:
Im Verzeichnis /home/www wird die RewriteEngine auf on geschaltet. Somit ist auch im Verzeichnis /home/www/test die RewriteEngine aktiv. Im Verzeichnis /home/www2 ist die Regel nicht aktiv. Um die RewriteEngine in den unteren Verzeichnissen auszuschalten, bedarf es in der .htaccess-Datei der Unterverzeichnisse lediglich einer Zeile
RewriteEngine Off
Erweiterungen, Verbesserungen und ergänzende Beispiele zu diesem kleinen Einstiegskurs werden jederzeit gern angenommen und in die Anleitung nach Rücksprache auch eingearbeitet.

