handcode.de Logo
php   button-maker   artikel   aki-artikel  

URLs mit RewriteRules "schöner" machen

Hier möchte ich eine Lösung für das bekannte Problem vorstellen, dass Suchmaschinen nicht gut auf URLs zu sprechen sind, die hauptsächlich aus GET-Parametern bestehen und diese daher nicht wie gewünscht indexiert werden.

Wenn zum Beispiel CMSe die Inhalte der Seiten dynamisch darstellen sehen die Links innerhalb der Seiten oft so aus:

http://www.example.org/dummy/index.php?id=2323452345&art=3456

Viel besser wäre hier eine URL wie diese:

http://www.example.org/dummy/tollesthema.php

Da die Systeme, die im "Hintergrund" die Daten aufbereiten, aber meist nicht dazu zu bringen sind vernünftige URLs zu verarbeiten, muss man sich dafür einen "Umweg" bauen.

Eine Möglichkeit so etwas zu realisieren sind RewriteRules für den Apache (extern mod_rewrite). mod_rewrite ist das "schweizer Taschenmesser" der URL Manipulation. RewriteRules haben aber auch den Ruf komplex, schwierig zu pflegen und anfällig für Fehler zu sein.

Meiner Ansicht nach, kommt es bei RewriteRules aber einfach darauf an, wie man diese einsetzt.

Ich habe schon des öfteren Rewrite-Regelsätze gesehen, die so lang, kompliziert und unpflegbar waren das man sowas wirklich nicht haben und vor allem nicht pflegenwill (für jede Seite/Rubrik ein Regelsatz, etc.).

Ein anderer Ansatz ist es, die Regeln so einfach und klein wie möglich zu halten und den Rest, das eigentliche Mapping der URL zum Content, von einem PHP Request-Parser erledigen zu lassen. In der Art als wenn man einen Apache vor einem Zope-Server mit virt. Host-Monster laufen hat.

Beispiel:

RewriteEngine On
# diese Regeln fangen die stat. Inhalte der Seite ab. Bilder, CSS,...
RewriteRule ^/static/ - [L]
RewriteRule ^/images/ - [L]
RewriteRule ^/css/ - [L]
RewriteRule ^/doc/ - [L]
# Der ganze Rest, also jede andere beliebige URL wird weitergeleitet
RewriteRule ^/(.*) /parser.php

In parser.php kann man auf (fast) alle Umgebungs/Globalen-Variablen zugreifen, als wäre parser.php selber das über die URL aufgerufene Script/File.

$_SERVER["REQUEST_URI"]
$_SERVER["PHP_SELF"]
$_SERVER["QUERY_STRING"]
$_POST
$_GET

Für die Clients und damit auch Suchmaschinen ist die Umleitung von den sprechenden auf die internen URLs völlig unsichtbar.

Rewrites müssen also nicht immer kompliziert sein um mit beliebig komplexen URLs umgehen zu können.

Die "Kunst" ist nun noch ein sauberes Mapping zwischen öffentlichen, schönen URLs und den hässlichen ID URLs zu zu erstellen. Jede URL die man nicht zuordnen kann wird mit einem HTTP Status 404 auf eine Standard-Seite umgeleitet.

 
$Id: rewrite.xml,v 1.5 2009/02/04 15:26:33 jg Exp $