joerghuelsermann.de Das rewrite Modul

Das rewrite Modul

Dieses mächtige Modul ist stark abhängig von der Verwendung von regulären Ausdrücken um die volle Wirkung entfalten zu können. Dieses Thema sollte man also mehr oder weniger auch verstehen um die Beispiele auf dieser Seite, die ich in der Praxis einsetze auch verwenden zu können.

Bei diesem Modul stellt man Bedingungen und Regeln auf so das die Regeln nur bei bestimmten Bedingungen greifen. Das ist ein weiterer elementarer Punkt der das Verständnis etwas erleichtert.

Modul aktivieren

Das Modul wird mit RewriteEngine on aktiviert. Falls man für ein Unterverzeichnis dieses Modul wieder abschalten möchte verwendet man dann RewriteEngine off. Auch wenn ich nur einmal in meiner htaccess dieses Modul starte, werde ich trotzdem auf dieser Seite bei jedem Beispiel die Prüfung des Moduls auf Vorhandensein und die Aktivierung bei den folgenden Beispielen verwenden.

Doppelte Inhalte

Doppelte Inhalte vermeiden

Um meine Domains immer von der unnötigen Angabe als Subdomain www. zu befreien verwende ich folgendes.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.joerghuelsermann\.de)(:80)? [NC]
RewriteRule ^(.*) http://joerghuelsermann.de/$1 [R=301,L]
</IfModule>

Ich weiss das man das auch kürzer hätte notieren können. Aber doch ist dieses Beispiel jetzt weniger in der Lage alles abzufangen.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*) http://joerghuelsermann.de/$1 [R=301,L]
</IfModule>

Hier wäre noch eine allgemein gültige Alternative. Ein gutes Beispiel dafür wie man eine Variable aus der vorherigen Bedingung wieder einsetzen kann.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</IfModule>

Und für diejenigen die das Gegenteil bezwecken möchten. Es ist aber in dieser allgemein gültigen Version ein Ansatz zu verstehen wie man gewisse Abfragen geschickt einsetzen kann.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Index Dateien

Um auch die Index Dateien auf ihr jeweiliges Verzeichnis umzuleiten ist folgendes geeignet,wenn keine Parameter angegeben werden.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{QUERY_STRING} ^$ 
RewriteRule ^(.*)index\.(php|html?) /$1 [L,R=301]
</IfModule>
Parameter entfernen

Um auch Parameter aus einer Url zu entfernen und dabei auch Ausnahmen von dieser Regel dann zu definieren eignet sich dieser Ablauf.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !ausnahme\.php
RewriteCond %{QUERY_STRING} !^$ [NC] 
RewriteRule (.*) %{REQUEST_URI}? [R=301,L]
</IfModule>
Parameter entfernen bei Umleitung auf einen Anker

Ein seltener Fall ist eine Umleitung auf einen Anker. Um dabei auch das Setzen von Parametern zu berücksichtigen kann man folgende Wege gehen. Im ersten Fall werden alle Angaben mit Parameter als nicht existierend betrachtet.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(anker|umleitung)$ /webseite/#$1 [L,R=301,NE]
</IfModule>

Im zweiten Fall werden alle Parameter bei der Umleitung auf den Anker entfernt.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(anker|umleitung)$ /webseite/#$1? [L,R=301,NE]
</IfModule>

Alternative Datei verwenden

Quelle definieren

Um eine andere Datei im Hintergrund zu verwenden anstatt der augerufenen, eignet sich wieder eine einfache Angabe in diesem Modul. Es gibt halt eben gewisse Standardadressen die definiert sind und wenn man diese dynamisch erzeugt benötigt man so etwas.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^datei.txt$ /datei.php
</IfModule>

Quellen ohne Parameter aufrufen

Aufruf ohne Parameter

Um etwas lesbarere Adressen zu verwenden kann man mit regulären Ausdrücken auch das Prinzip des Aufrufs einer Alternative etwas modifizieren.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^verzeichnis/([A-Fa-f0-9]{6})$ /verzeichnis/datei.php?parameter=$1 [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^verzeichnis/(.+)/([A-Fa-f0-9]{6})$ /verzeichnis/$1.php?parameter=$2 [QSA]
</IfModule>

Nicht mehr vorhanden

Statuscode 410 Gone

Um für gewisse Dateien in einem Unterverzeichnis den Statuscode 410 zu senden habe ich in meiner htaccess diesen Inhalt eingefügt.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^verzeichnis/([a-f0-9]{3})$ - [G]
</IfModule>

Umleitung mit regulären Ausdrücken

Umleitung

Dadurch das gewisse Browser mit dem xml:base Attribut in einer SVG Datei nicht umgehen konnten war ich gezwungen dafür eine Umleitung von einem Verzeichnis zum anderen vorzunehmen. Also in das ursprüngliche Verzeichnis eine htaccess Datei eingetragen, die alle dieser betroffenen Seiten umleitet.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^quelle/([A-Fa-f0-9]{6})$ /ziel/$1 [R=301,L]
</IfModule>

Browserweiche

Ausgabe als XHTML

Um Dateien für geeignete Browser als XHTML auszugeben verwende ich dieses in meiner htaccess Datei.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} \.(html?)$
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteRule .* - "[T=application/xhtml+xml; charset=UTF-8]"
</IfModule>

Dateiformate

Nicht unterstützte Dateiformate

Um einigen Dateiformaten den entsprechenden Content Type zuzuordnen sind in der Regel folgende Beispiele in der htaccess Datei hilfreich.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} \.(mml?)$
RewriteRule .* - "[T=application/mathml+xml; charset=UTF-8]"
RewriteCond %{REQUEST_URI} \.webm$
RewriteRule .* - "[T=video/webm]"
</IfModule>

Kurz Url Dienst

Kurz Url Dienst Datenbank

Um die Datenbank für meinen privaten Kurz Url Dienst nach der Entfernung der Parameter, die schon bereits vorgenommen wurde nur bei Übereinstimmung des regulären Ausdruckes das entsprechende Skript aufzurufen, dient dieser Abschnitt. Dabei dient der reguläre Ausdruck quasi als ein Vorfilter zur Überprüfung.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(\w{1,8})$ /datei.php?parameter=$1 [QSA]
</IfModule>

RGB Farben

Kurz Url Dienst für die RGB Farben

Um von meinem privatem Kurz Url Dienst auf die Farbdatenbank der RGB Farben zurückgreifen zu können und um kürzere Adressen zur Verfügung zu haben war nicht viel nötig.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^rgb([a-f0-9]{6})$ http://joerghuelsermann.de/farbe/$1 [R=301,L]
</IfModule>

Mediwiki

Mediwiki Adressen

Ich hatte einen Weg gesucht unter Beibehaltung des Verzeichnis für mein Wiki auf Basis Mediawiki die Adressen zu verkürzen und dabei auch ohne Schleife umzuleiten.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} index\.php
RewriteCond %{QUERY_STRING} title=([^&]*)$ 
RewriteRule ^wiki/.*$ /wiki/%1? [R=301,B]
RewriteCond %{REQUEST_URI} !index\.php
RewriteCond %{QUERY_STRING} ^$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^wiki/(.+)$ /wiki/?title=$1 [PT,L,QSA,B]
</IfModule>

Spiegel Seiten

Aussperren von Spiegelseiten

Die einfachste Möglichkeit einige Spiegelseiten auszuschliessen ist es per htaccess diese anzusprechen. Dabei kann man halt eben alternative Inhalte ausgeben oder auch gar keine Inhalte senden.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !mirror\.php
RewriteCond %{HTTP_USER_AGENT} ^AppEngine-Google
RewriteRule ^(.*)$ http://%{HTTP_HOST}/mirror.php [R=301,L]
</IfModule>

Die Alternative wäre einfach den Zugriff zu verbieten.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^AppEngine-Google
RewriteRule ^(.*)$ - [F]
</IfModule>