Apache-Modul „mod_rewrite“ mit HTML-Forms nutzen

Mit der Hilfe des Apache-Moduls „mod_rewrite“ kann auf einfache Art und Weise eine URL deutlich verschönert und für Suchmaschinen optimiert werden. So können endlos lange Parameterketten vermieden und in einfachen schlichten URL’s untergebracht werden. So können URL’s wie folgende:

http://www.example.de/search.php?type=full&keyword=MeineSuche

Zum Beispiel so verschönert werden:

http://example.de/search/full/MeineSuche

Der Vorteil sollte dabei klar auf der Hand liegen. Zum Einen erkennen Benutzer nicht direkt die Struktur der dahinterliegenden Webanwendung und zum Anderen kommen sowohl Benutzer als auch Suchmaschine damit besser zurecht.

Da bleibt ja eigentlich nur noch die Frage, wie dies zu realisieren ist. Nun zunächst einmal sollte das Apache-Modul „mod_rewrite“ auf dem Server installiert sein. Um zu prüfen, ob das Modul installiert und aktiviert ist, kann folgender PHP-Code verwendet werden:

in_array("mod_rewrite", apache_get_modules());

Anschließend müssen wir lediglich noch unsere „.htaccess“-Datei erstellen bzw. bearbeiten. Da wir aber weder unsere gesamte Webseite umschreiben wollen noch bisher bestehende URL’s zerstören wollen, wird es ein wenig komplexer. Aber andererseits ist dies auch die einzige, mir bekannte Möglichkeit das Ganze auch für HTML-Forms wie z.B. Suchfelder zu nutzen. Wir erstellen uns also nun eine „.htaccess“-Datei im Root-Verzeichnis unseren Webservers (alternativ bearbeiten wir die bestehende). Hier fügen wir nun folgendes ein:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} /search.php$
RewriteCond %{QUERY_STRING} ^type=([A-Za-z0-9\-_\s]+)&keyword=([A-Za-z0-9\-_\s]+)$
RewriteRule ^(.*)$ /search/%1/%2/? [R=301,L]

RewriteRule ^search/([A-Za-z0-9\-_\s]+)/([A-Za-z0-9\-_\s]+)/?$ /search.php?type=$1&keyword=$2&is_rewrite=true [L,QSA]
</IfModule>

Hierbei könnte nun folgende HTML-Form z.B. als Suchfeld genutzt werden:

<form action="search.php" method="GET">
	<input type="hidden" name="type" value="full" />
	<input type="text" name="keyword" value="" />
	<input type="submit" value="Suchen" />
</form>

Damit erreichen wir exakt das oben beschriebene Szenario. Die ursprüngliche URL (die immer noch in dieser Form entsteht) wird in der Ansicht schöner dargestellt. Nun können wir natürlich auch direkt auf die schönere alternative Verlinken, aber auch weiterhin den alten Link benutzen. Hierbei ist jedoch einiges zu beachten. Unter anderem das „&is_rewrite=true“, das am Ende meiner zweiten „RewriteRule“ steht (um zirkulaire Referenzen zu verhindern, jedoch können hier auch andere Dinge wie z.B. „&a=1“ oder ähnliches verwendet werden). Wird die URL wieder genau gleich aufgebaut, werden wir in einer Endlos-Schleife laufen. Auch zu bedenken ist, wenn die Anzahl an Parametern variiert oder diese Änderung allgemein für alle URL’s gelten soll, muss dies alles einzeln eingetragen werden. So kann z.B. für verschiedene Unterseiten über ein „display“-Parameter auf der „index.php“ angezeigt werden, ob noch folgende Zeilen im „IfModule“-Tag eingefügt werden sollen:

RewriteCond %{REQUEST_URI} /index.php$
RewriteCond %{QUERY_STRING} ^display=([A-Za-z0-9\-_\s]+)$
RewriteRule ^(.*)$ /display/%1/? [R=301,L]

RewriteRule ^display/([A-Za-z0-9\-_\s]+)/$ /index.php?display=$1&is_rewrite=true [L]

Alles Weitere zu „.htaccess“-Dateien kann zum Beispiel auf Ask Apache wunderbar nachgelesen werden. Allgemein kann ich es nur jedem Webserver Administrator nahe legen, sich mit „.htaccess“-Dateien auseinander zu setzen. Hier sollte jedoch bedacht werden, dass Systeme wie u.a. WordPress selbst die „.htaccess“-Datei anhand der entsprechenden Konfiguration erstellt.