Die Datei .htaccess bietet Steuerungsmöglichkeiten für die Server-Software Apache. Mit ein paar Einträgen kann der Pfad der aufgerufenen Datei verändert, verschleiert oder auch ergänzt werden. Dahinter steckt das Modul mod_rewrite, bekannt unter dem Namen 'Schweizer Taschenmesser des Apache'. Dieser Artikel soll erklären, wie man reguläre Ausdrücke in seiner .htaccess verwendet, um den aufrufenden Hyperlink zu verändern.
Dieser Artikel wendet sich an Verwender von virtuellen Hosts, deren Provider die Direktiven von mod_rewrite nicht abgeschaltet haben. In den meisten Fällen aber sollte es funktionieren. Mod_rewrite funktioniert nur auf dem Apache-Server.
Bekanntermaßen bietet die Datei .htaccess Steuerungsmöglichkeiten für die Server-Software Apache. Der Provider (ich wollte ja von einem virtuellen Server ausgehen) kann in der Konfiguration des Apache einstellen, welche Befehle auch in der .htaccess verwendet werden dürfen. Wichtigste Überlegungen sind dabei Sicherheit und Performance auf der einen und breite Anwendungsmöglichkeiten durch den Kunden auf der anderen Seite.
Eine Einführung in dieses Thema wäre nicht komplett, ohne zumindest einige der wichtigsten Apache Module zu nennen. Es ist ja gerade das Modulprinzip, welches den Apache so flexibel einsetzbar macht. Wer auf dem eigenen Rechner ein WAMP oder LAMP-System aufgesetzt hat, suche in der Datei httpd.conf im Apache-Verzeichnis nach dem Abschnitt "Dynamic Shared Object (DSO) Support". Dort findet sich eine ganze Liste an Standardmodulen, unter anderem auth_module, speling_module, das wichtige cgi_module und auch Möglichkeiten, PHP als Modul einzubinden. Die Module werden durch auskomentieren den #-Zeichens eingebunden und stehen nach dem Neustart des Apache zur Verfügung. Uns interessiert hier das rewrite_module.
Um die Metazeichen in den regulären Audrücken besser verstehen zu können, verweise ich auf meinen Artikel bei DrWeb, der am Beispiel des kostenlosen Editors NoteTab die wichtigsten Metazeichen auflistet. Unter http://drweb.de/programmierung/regulaere_ausdruecke.shtml sind also die Bedeutungen von .*[0-9]? und Konsorten aufgelistet.
Nun, genug der Vorreden, meint der Leser? Ganz recht - starten wir mit einem leeren Dokument in NotePad oder dem Texteditor nach Wahl - nur Word sollte es nicht sein. Dass wir die Datei als .htaccess abspeichern, wird sich von selbst verstehen. Doch Vorsicht! Auf Windows-Rechnern hängt das Betriebssystem schon mal gerne die Endung .txt an. In diesem Fall sollte man im Dateimanager mittels F2 den (markierten) Dateinamen bearbeiten.
Die .htaccess bezieht sich immer auf einen Ordner samt Unterverzeichnisse. Will man zwei verschiedene Verzeichnisse unterschiedlich bearbeiten, sollte man auch zwei Dateien erstellen, obwohl es theoretisch eine einzige in einem übergeordneten Verzeichnis auch tun würde. Aus Geschwindigkeitsgründen sollte man kleinere Dateien vorziehen. Sollen die Direktiven für jeden (Sub-)Ordner gleich gelten, speichert man die .htaccess natürlich direkt im Ordner darüber.
In der Datei .htaccess kann man den aufrufenden URI mit regulären Ausdrücken auf gleich zwei Arten verändern: Für den Seitenbesucher sichtbar oder versteckt. Beginnen wir mit mit der sichtbaren Version:
Wir wollen alle Anfragen auf die Datei www.example.de/preisliste.html nach einem Relaunch auf den neuen Shop unter shop.example.de/preise.php umleiten. Zwei Zeilen in einer .htaccess genügen - und dienen uns zum Aufwärmen:
RewriteEngine on
RewriteRule ^/preisliste.html shop.example.com/preise.php [R,L]
Die Rewrite Engine muss immer am Beginn einer .htaccess mit URI-Manipulationen einmalig eingeschaltet werden. Wer obigen Artikel über die Metazeichen aufmerksam gelesen hat, kann dies sofort übersetzen:
Am Anfang des aufgerufenen Pfades steht ein / (was bei allen Aufrufen des Stammverzeichnisses der Fall ist - man vergleiche mit eigenen Logfiles), gefolgt von der Datei preisliste.html. Nach einem Leerzeichen steht schlicht die neue Adresse im Klartext da, lediglich das Anhängsel ist wieder eine Besonderheit: R erzwingt den externen Redirect, der Sufer sieht also eine neue Adrese in der Browseradresszeile auftauchen. Mit Komma getrennt ist weiterhin der 'flag' L für last rule angefügt. Hiernach erwartet Apache keine neue RewriteRule mehr.
Denn RewriteRule Direktiven ist alles, womit wir es hier zu tun haben werden: RewriteEnginge on und eine RewriteRule definiert, die letzte mit [L] angeschlossen ist das ganze Geheimnis!
Mit der gleichen Logik erzwingt dieses Beispiel hier einen Neuaufruf auf der gleichen Domain:
RewriteEngine on
RewriteRule ^/preisliste.html /preise.php [R,L]
Hinweis: Sollten Fehler beim Testen auftreten, mal testweise die beiden Zeichen ^/ am Anfang der RewriteRule entfernen. Je nach Konfiguration des Servers können Unterschiede auftreten!
Nun, aber für jede Seite einen neuen Eintrag scheiben? Etwas umständlich, ich weiß. Und die Dateigröße hatte ich auch schon ins Feld geführt. Nun, an dieser Stelle kommen die regulären Ausdrücke ins Spiel. Wer damit noch nichts zu tun hatte, setze sich aufrecht hin und konzentriere sich:
Ein regulärer Ausdruck überprüft einen String gegen die niedergeschreibene Regel. Bei Gültigkeit liefert er einen "Treffer". Wahr oder nicht wahr, ist also hier die Frage. *)
Doch wäre das ganze nutzlos, hätte man kein "Gedächtnis" eingebaut. Um es kurz zu machen: Alles, was zwischen Klammern () steht, wird für die Dauer der Überprüfung zwischengespeichrt. yvonne(catherine) auf regexianisch läßt (catherine) im weiteren Verlauf nicht vergessen sein, yvonne aber schon.
RewriteEngine on
RewriteRule ^/(deutsch)/texte/(catherine).html$ /texte.php?sprache=$1&seite=$2
Da wir keinen [R] externen Redirect veranlassen, bleibt in der Adresszeile /deutsch/texte/69.html stehen. Intern ruft der Apache aber die Datei /texte.php?sprache=deutsch&seite=catherine auf. Catherine wurde also tatsächlich nicht vergessen!
Jetzt sind wir nur noch einen Schritt von einer wirklich anwendbaren Lösung entfernt. Wie bei der Dateisuche im Windows Dateimanager bieten Reguläre Ausdrücke Platzhalterzeichen an. Der wichtigste ist der Punkt für ein beliebiges Zeichen, null-, ein- oder mehrmals wiederholt einforderbar mit einem folgenden ? oder * (siehe erwähnten Drweb-Artikel)
RewriteEngine on
RewriteRule ^/(deutsch)/texte/(.*).html$ /texte.php?sprache=$1&seite=$2
Dies ist nun die Dateigröße sparende Version! Der reguläre Ausdruck behält sich automatisch eine beliebige Zeichenfolge und übergibt sie an ein PHP-Script. (Dass wir sie dort validieren, versteht sich von selbst)
Es ist eine Besonderheit der Klammern, dass sie auch verschachtelt werden können und dennoch mit $xy etc angesprochen werden können. Für die Reihenfolge ist die öffnende Klammer maßgeblich. Wollen wir bsw. nur zwei Sprachen umschreiben, bedienen wir uns des "Oder"-Zeichens wie folgt:
RewriteEngine on
RewriteRule ^/((deutsch)|(english))/texte/(.*).html$ /texte.php?sprache=$1&seite=$4
Man beachte, dass "seite" jetzt mit $4 angesprochen wird wird. Damit sollte ein großer Teil der URI-Manipulation abgedeckt sein. Wie alle anderen Autoren kann ich für den tieferen Einstieg nur das Buch "Reguläre Ausdrücke" von Jeffrey Friedl empfehlen, denn ein gelungener regulärer Ausdruck hat etwa Lyrisch-Geballtes von hoher Schönheit. Sein Werk jedoch hier mit knapp 1000 Wörtern zusammenzufassen wäre vermessen... (Es ist übrigens von Andreas Karrer auch hervorragend übersetzt)
Dieser Artikel hört damit an der Stelle auf, wo die Befehle noch lesbar bleiben. Ein kleiner Anreiz aber zur weiteren Beschäftigung mit diesem Thema: Auch den Bilderklau von unauthorisierten Seiten kann man hiermit verhindern! Infos hat:
Um zu kommentieren musst Du eingeloggt sein.