Virtuelle Adressen, umgeschriebene Links oder rewritten URLs mit PHP

Rewritten URLs, Real URLs, Speaking URLs oder Speaking Adresses, menschenlesbare Links, umgeschriebene Links, schöne Links, virtuelle Links, virtualle Adressen oder einfach kein GET mehr - das alles sind Bezeichnungen die im Internet für eine mittlerweile weit verbreitete Technik stehen: das umschreiben der Links der eigenen Website zwecks suchmaschinen- und menschen-freundlicher Adressen.

Langer Rede kurzer Sinn: wie programmiert man in PHP so, dass man anstatt kryptischen Links wie index.php?get=article&id=2 sympathischere produziert wie zum Beispiel /article/Das-ist-eine-schoene-Schlagzeile/

Um das umzusetzen gibts natürlich wieder viele Ansätze, ich liefere hier jenen, welchen ich selber schon eine ganze Weile verwende - abgeschaut bei der Wikipedia. Dort bedient man sich nämlich eines Tricks: Die Wenigsten wissen nämlich, dass man hinter einer URL zu einer Datei einfach munter weiterschreiben kann, ohne dass es den Server groß irritiert.

Zum Beispiel:
http://webstylez.net/index.php/ich-schreib-einfach-munter-weiter/
Der Server bleibt hier bei index.php stehen und ignoriert was dahinter noch kommt einfach.

Mit einer einfachen Regel in einer .htaccess Datei versteckt man dann das index.php einfach ...

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ index.php/$1 [L]

... und schon hat man schöne Links, und eine PHP-Datei, die gefunden wird und in der man diese dann verwerten kann.

Die beiden ersten Regeln sagen dem Server dass er zuerst schauen soll ob der Link auf unserem Server wirklich exisitert. Also mit !-f obs die Datei nicht vielleicht wirklch gibt und mit !-d obs das Verzeichnis nicht eventuell echt gibt. Das brauchen wir damit wir Stylesheets, Bilder und andere Dateien der Homepage einbauen können ohne, dass wir auch deren Links umschreiben müssen. Ein Bild mit dem Link /images/picture.jpg, wird so trotzdem gefunden, obwohl wir die URL umgeschrieben haben.

Mit der Rewrite Rule schließlich sagen wir dem Server er soll alles ^(.*)$ was oben in der Adressleiste nach der Domain reinkommt fiktiv hinter das index.php reinschreiben. Wir mogeln es also heimlich dazwischen - der Besucher merkt davon nichts.

Wenn wir jetzt in der index.php einfach die globale $_SERVER Variabel ausgeben finden wir darin praktischerweise einmal die "echte" und einmal unsere "virtualle", also die umgeschreibene URL:

[SCRIPT_NAME] => /index.php
[PHP_SELF] => /index.php/ich-schreib-einfach-munter-weiter

Jetzt ziehen wir einfach die eine von der anderen ab, und fertig is unser virtueller Link:

<?php
	$address = str_repalce($_SERVER['SCRIPT_NAME'], '', $_SERVER['PHP_SELF']);
?>

Man könnte natürlich einfach manuell das index.php rausnehmen, was diesen replace aber praktisch macht, ist, dass er auch mit Unterordnern automatisch funktioniert.

Jetzt splitten wir einfach die Schrägstriche raus und schon haben wir einen Array wo brav jedes Level unserer virtuellen Adresse drin steht. Splitten kann man einfach mit der Funktion explode:

<?php
	$levels = explode('/', $address);
?>

und dann kann man je nachdem wie mans lieber hat einfach mit einer while, for oder foreach durchlaufen und scripten was in jedem leven passiert:

<?php
	foreach ($levels as $level => $name) {
		// $level sind zahlen ab 0
		// $name sind die virtuellen URLs zwsichen den Schrägstrichen
	}
?>