Daniel Baltes Amado Full Stack Entwickler

htaccess, mod_rewrite und pretty urls

Ein plattformformübergreifendes Mittel zur Manipulation und Validierung von Strings sind Reguläre Ausdrücke. Den häufigsten Einsatz von Regex findet man wahrscheinlich in der .htaccess um mithilfe des mod_rewrite-Moduls schönere Webadressen (bei google eher unter pretty urls zu finden) ohne hässliche Parameter zu erzeugen. Diejenigen, die kein fertig CMS wie Wordpress oder ähnliches verwenden, müssen früher oder später selbst Hand anlegen um in den Genuss dieses features zu kommen.
Hier ein Auszug aus der .htaccess dieses Blogs:


Options +FollowSymLinks
RewriteEngine on
Rewritebase /
RewriteCond %{HTTP_HOST} ^phunkei.de$ [NC]
RewriteRule ^(.*)$ http://www.phunkei.de/$1 [R=301,L]

RewriteRule ^blog?$ index.php?site=blog&page=0
RewriteRule ^blog/p([1-9]{1}[0-9]*)?$ index.php?site=blog&page=$1

Die erste Zeile RewriteEngine on sorgt dafür, dass das entsprechende Modul auch aktiviert wird. Die zweite Zeile legt den Ausgangspfad ohne Host fest. Angenommen eure Seite befände sich unter der Adresse http://www.example.com/homepage/, wäre hier /homepage/ einzutragen.
Die folgenden beiden Zeilen


RewriteCond %{HTTP_HOST} ^phunkei.de$ [NC]
RewriteRule ^(.*)$ http://www.phunkei.de/$1 [R=301,L]

bringen die erste Funktionalität. Oftmals sind Webseiten mit und ohne die Subdomain www erreichbar. Das führt unweigerlich zu Duplicate Content. Google soll diesen Umstand mit einem schlechteren Ranking bestrafen (Ob das wirklich der Fall ist, kann ich nicht mit Sicherheit sagen). Wir legen also eine Condition fest: Sollte die aufgerufene Adresse ohne www beginnen, leiten wir den Benutzer um. Die Umleitung ist in der unteren Zeile geregelt (Rule) mit dem Parameter dieses unter dem http-code 301 zutun, welcher für eine permanente Weiterleitung steht.
Schauen wir uns die nächsten beiden Zeilen an:


RewriteRule ^blog?$ index.php?site=blog&page=0
RewriteRule ^blog/p([1-9]{1}[0-9]*)?$ index.php?site=blog&page=$1

Die erste sorgt dafür, dass der Aufruf von www.phunkei.de/blog den Parameter site mit dem Wert blog versieht und page mit dem Wert 0. Es soll also der Blog geladen werden mit der entsprechenden Seitenzahl. Logisch oder? Spannender wird es in der folgenden Zeile, da wir hier wirklich einen Teilstring auslesen. ([1-9]{1}[0-9]*) steht für folgendes: Zeichen zwischen 1 - 9 genau 1-mal, dann wieder Zeichen zwischen 0 - 9 aber beliebig oft. Zulässige Werte bestehen also dem String blog/p zusammenhängend mit ganzen Zahlen von 1 - Unendlich (Wer weiß wieviele Seiten dieses Blog noch fassen wird). Rechts daneben haben wir eine Übersetzung für den Ausdruck, wobei $1 für den ersten Teilstring steht, der in () steht. Gibt es mehrere solcher Teilstrings, die wir für die Übersetzung benötigen, so werden diese logischerweise der Reihenfolge entsprechend mit $1 bis $n referenziert. Damit wäre die Grundsätzliche Frage nach der Arbeitsweise von mod_rewrite geklärt und mit diesem simplen Beispiel lässt sich schon ein Großteil aller Adressen umsetzen. Neben Ziffern sind natürlich auch andere Zeichen möglich.



Es gibt auch ganze Zeichenklassen die eine verkürzte Angabe des Wertebereichs ermöglichen. Die meisten davon sind zB. hier zu finden. Es ist aber ebenso wichtig die Anzahl dieser Zeichen zu begrenzen. Dafür stehen folgende Quantoren zur Verfügung.



Mit diesem Grundlagenwissen lassen sich beinahe alle möglichen Formen für Pretty Urls finden. Die Syntax ist sehr sensibel und kleine Fehler können einen kompletten Ausdruck verändern. Wer seine Regex gerne testen möchte, kann sich einfach eine php-Datei erstellen und die $_GET-Variable ausgeben. Hier sieht man dann wunderbar, welche Werte aus der aufgerufenen Adresse welchem Parameter zugewiesen werden.

1 Kommentar

Knarakaru

Hat mir sehr geholfen!
Vielen Dank!