Effizienter Redirect

Was hat ein Schneider mit einer .htaccess-Datei, dem Apache-Webserver und einem Redirect zu tun? Eigentlich nichts. Aber uneigentlich ...

... gibt es eine kleine Parallele. Der Meister der Nadel schlägt im Märchen mehrere Fliegen mit einem Streich. Mit dem Befehl "RedirectMatch" ist das ebenfalls möglich.

Problem

Bei einer Website lagen mehrere HTML-Dateien in einem Unterverzeichnis. Diese wurden im Zuge eines Relaunch durch ein neues Dokument im Hauptverzeichnis ersetzt. Mit Hilfe des Kommandos "Redirect" [1] in der .htaccess-Datei sollten Aufrufe der veralteten Seiten zur neuen Datei umgelenkt werden. Dieser Versuch war nicht von Erfolg gekrönt. Weitere Details dazu verkneife ich mir an dieser Stelle und beende hiermit die Vorgeschichte.

Lösung & Theorie

Um das o.g. Problem zu lösen, brauchen wir die .htaccess-Datei, den Apache-Webserver und das Kommando RedirectMatch [2]. Dieses hat folgenden Syntax:

RedirectMatch [status] regex url

Zuerst wird die Redirect-Anweisung notiert. Dann folgt eine Status-Angabe, um die Dauer des Umlenkens festzulegen. Es bieten sich folgende Möglichkeiten:

  1. permanent  (dauerhaft)
  2. temp  (zeitweilig)
  3. seeother  (Dokument wurde ersetzt)
  4. gone  (Dokument nicht mehr existent)

Für regex notieren wir einen regulären Ausdruck, die sogenannten "regular expressions". Entspricht ein URL-Aufruf diesem Muster, dann wird umgelenkt. Andernfalls passiert nix.

Abschließend wird die "URL" angegeben, zu der umgelenkt werden soll. Beim Status "gone" entfällt diese Angabe. Was weg ist, ist weg.

Die folgenden Beispiele sollten größere Unklarheiten beseitigen. Wer Informationen zur Thematik "regular expressions" benötigt, der wird z.B. im SelfHTML [3] fündig. Damit ist der theoretische Teil abgehakt.

Unterverzeichnis-Problem

Jetzt wird es wieder praktisch. Mit folgendem Eintrag im .htaccess-File werden sämtliche Anforderungen an das Unterverzeichnis "alt" zum neuen Dokument umgelenkt. So wurde übrigens das anfangs geschilderte Problem gelöst.

# alt umlenken
RedirectMatch  permanent  ^/alt/  http://www.domain.de/neu.html

Zeile 1 ist ein Kommentar. Die 2. Zeile wurde erklärt. Ein kurzer Blick auf den regulären Ausdruck: ^/alt/ . Ausgehend vom Hauptverzeichnis werden alle Anforderungen an das Unterverzeichnis "alt" zur neuen URL http://www.domain.de/neu.html umgelenkt. Dies gilt für alle folgenden Beispiel-Adressen:

http://www.domain.de/alt/
http://www.domain.de/alt/index.html
http://www.domain.de/alt/xchjkfjl.ght

Dabei ist es egal, ob das angeforderte Dokument je existierte. In dem Moment, wo eine Datei aus dem Verzeichnis "alt" angefordert wird, wird zur neuen URL umgelenkt.

Neue Dateiendung

Abschließend möchte ich noch ein interessantes Beispiel vorstellen. Wer sein Webprojekt auf eine neue Dateiendung umstellen möchte, kann mittels RedirectMatch eine effiziente Variante für ein Umlenken realisieren. Der Eintrag im .htaccess-File sieht beispielsweise so aus:

# aus html wird shtml
RedirectMatch  permanent  (.*)\.html$  http://www.domain.de$1.shtml

Was geschieht hier? Ganz einfach, angeforderte Dateien mit der Endung .html werden zu der gleichnamigen Datei mit der Endung .shtml umgelenkt. Laut unserer Notation gilt diese Festlegung übrigens für den kompletten Webaccount, also für alle .html-Dateien. Zwei Beispiele:

http://www.domain.de/index.html ==> http://www.domain.de/index.shtml
http://www.domain.de/rematch.html ==> http://www.domain.de/rematch.shtml

Bei Web-Projekten, die mit PHP arbeiten und wo bisher die Dateiendung .php3 oder .php4 eingesetzt wurde, könnte eine Umstellung auf das kürzere .php so aussehen:

# php-Verkuerzung
RedirectMatch  permanent  (.*)\.php4$  http://www.domain.de$1.php

Die Möglichkeiten sind fast unbegrenzt. Mit Hilfe der regulären Ausdrücke lassen sich interessante Dinge realisieren. Vor der Umsetzung neuer Ideen ist ein (lokales) Testen empfehlenswert. Viel Spaß beim Ausprobieren.

Quellen & Links

[1] Fünfmal Redirect (schmager.de)
[2] Apache-Handbuch "mod_alias"
[3] Regulärer Ausdruck (selfhtml.org)


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0