Shop-Hilfe.com
Aktuelles
Startseite
TP Wettbewerbe
Sitemap
Service
Hilfe-Forum
Kolumnen
Linktipps
Buchrezensionen
Traum-Team
Newsletter
Traumquelle
Dreamweaver
Fireworks
Photoshop
Flash
Traum-Start
gimp
GoLive
php / Apache
Sonstige
Grundlagen
Usability
CSS
Apple / Mac
3D
Intern
TP-Sponsor
TP SHOP
Bild Galerie
TP Wallpapers
Forum-Archiv
Link zu uns
Impressum
Zurück  
TP Portal > php / Apache > URI Manipulation - mod_rewrite in der Praxis

URI Manipulation - mod_rewrite in der Praxis

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.

Die Einträge in die .htaccess sind nichts weiter als reguläre Ausdrücke.

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:

Aufgabenstellung: 

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:

Es geht los - die neue Aufgabenstellung:

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:

Links:

Buchrezension

Coverimage
AJAX Hacks
Dynamische Webseiten mit AJAX programmieren - dieses Handbuch bietet einen praktischen Einblick.
[mehr]
Gimahhot - Shopping
TP-Partner
Sprachreise London
Webmasterpro
Computerhilfen
Computerhilfen
Eventagentur Hamburg
it-rechtsinfo.de
Designguide
Getreidemühlen
sk-typo3
Kochkurs Berlin
Maandiko.de
d. Webdesigner
PSD Tutorials
Medizin
Handy Forum

Hier könnte Ihre Werbung stehen

 >> INFO << 

\ Startseite | Forum | Impressum | nach oben | Seite zurück /