Current page: Code snippets » HTML, CSS und JavaScript » URL Rewriting

URL Rewriting

Der weit verbreitete Apache-Webserver bietet mit seinem mod_rewrite-Modul ein sehr mächtiges Werkzeug, um URLs und Seitenanforderungen umzuschreiben oder zu anderen Zielen umzuleiten, bevor sie bearbeitet werden. Das ermöglicht es, außerhalb des Programmcodes Weiterleitungen zu anderen Domains oder Verzeichnissen einzurichten oder die tatsächliche Verzeichnisstruktur vor dem Besucher zu verbergen. Auf dieser Seite stelle ich einige nützliche mod_rewrite-Schnipsel vor, die alltägliche Probleme lösen.

Dateiendungen verbergen

Üblicherweise kann man in der URL bereits erkennen, mit welcher Skriptsprache die Webseiten programmiert sind. PHP-Seiten tragen demnach ein „.php“ in den Dateinamen, Java Server Pages ein „.jsp“ und statische HTML-Dateien erkannt man oft am bekannten „.html“. Dadurch beschreiben URLs aber nicht nur Identifikatoren für die eigentlichen Inhalte, sondern sind auch von der verwendeten Technik abhängig. Was zu dem Problem führt, dass sich die URLs ändern, wenn man die Skriptsprache wechselt. Und so zahlreich, wie diese heute sind, kann das schonmal vorkommen. Daher habe ich diese Konfiguration entwickelt, mit der URLs ohne Dateiendung oder mit einer Ersatz-Dateiendung auf vorhandene Skriptdateien mit anderem Namen umgeleitet werden, ohne dass der Besucher etwas davon mitbekommt. Das ganze funktioniert sogar so, dass einzelne Seiten mit verschiedener Dateiendung vorliegen und jeweils die existierende ausgewählt wird.

[o] Source code view: dateiendungen_verbergen.apache.txt
RewriteEngine On

# Replace ".php" by ".html"
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} ^(.*)\.html$
RewriteCond %1\.php -f
RewriteCond %{REQUEST_URI} ^(.*)\.html$
RewriteRule ^(.*)$ %1.php [L]

# Replace ".php" by ""
#
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

# External redirect for files requested as a directory (remove trailing slash)
#
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteCond %1 -U
RewriteRule ^(.*)$ %1 [L,R]

Die erste Zeile im Beispiel aktiviert zunächst die URL-Umschreibung in Apache.

Der erste Abschnitt enthält Konfigurationsanweisungen, die als .html-Datei angeforderte Seiten intern auf die gleichnamige .php-Seite umleitet, sofern die .html-Datei nicht bereits existiert und eine .php-Datei gefunden wurde. Das ermöglicht es, alle einzelnen Seiten in der URL mit der Dateiendung „.html“ zu referenzieren, obwohl tatsächlich PHP-Dateien gespeichert sind und vom Webserver ganz normal wie solche verarbeitet werden. Tatsächlich vorhandene HTML-Dateien bleiben davon unberührt und werden wie gewohnt ausgeliefert. Benennt man später aus irgendeinem Grund die Dateien um, z.B. von *.php nach *.py, braucht man nur die zu suchende Dateiendung in dieser Konfiguration ändern (oder eine zusätzliche hinzufügen) – alle URLs funktionieren nach wie vor, es sind keine Änderungen an der Links nötig und Links von anderen Webseiten oder Suchmaschinen bleiben gültig.

Der zweite Abschnitt enthält Konfigurationsanweisungen ähnlich dem ersten Abschnitt, nur dass statt einer Ersatz-Dateiendung wie „.html“ gar keine Dateiendung verwendet wird. Die Datei „/inhalt/kontakt.php“ kann somit über die URL „/inhalt/kontakt“ aufgerufen werden. Da hier nicht erst die Ersatzendung herausgeschnitten werden muss, ist diese Konfiguration einfacher und deshalb kürzer.

Die beiden vorgenannten Abschnitte suchen jeweils für eine URL den tatsächlichen Dateinamen mit der angegebenen Dateiendung, in diesem Beispiel „.php“. Um nach mehreren Dateiendungen zu suchen, wenn z.B. PHP- oder Python-Implementierungen für unterschiedliche Seiten vorliegen, lässt sich der jeweilige Abschnitt beliebig oft für weitere Dateiendungen wiederholen. Falls ein Dateiname mit mehreren unterstützten Endungen gefunden würde, entscheidet die Reihenfolge der Abschnitte in der Konfigurationsdatei; allerdings empfehle ich nicht, sowas zu tun.

Das vollständige Verbergen der Dateiendung wie im zweiten Abschnitt beschrieben führt bei Dateien zu URLs, die denen von Verzeichnissen sehr ähnlich sehen. Gibt man die URL eines Verzeichnisses ohne den abschließenden Schrägstrich („/“) ein, leitet der Webserver den Browser automatisch auf die richtige Adresse um und der Schrägstrich wird hinzugefügt. Andersherum sollte der Schrägstrich aber auch entfernt werden, wenn die URL kein vorhandenes Verzeichnis beschreibt, aber ohne den Schrägstrich existieren würde. Diese Aufgabe übernimmt schließlich der dritte Abschnitt.

Ich habe diese Angaben mit Apache-2.2/Win32 und Apache-2.0/Linux getestet, in verschiedenen Unterverzeichnissen und teilweise mit Query-Strings, hat überall funktioniert. Das RewriteLog (Level 9) gibt auch keinen Anlass zu Bedenken. Schaut also ganz gut aus, denk ich. :)

Ausblenden
Statistik wird geladen...