Themen
 
Individuelles Webdesign
 
01.03.2007 15:56

Saubere URLs ohne mod_rewrite

Kategorie: PHP, Tutorial
Für ein PHP-Projekt habe ich einige Zeit gerätselt wie ich am besten dynamischen Content dynamisch präsentieren, aber gleichzeitig so "hässliche" URL-Parameter-Würste vermeiden kann. Zuerst wollte ich mod_rewrite verwenden, aber es gibt eine einfachere Lösung.

Weder Menschen noch Suchmaschinen mögen "hässliche" URLs mit Parameter-Würsten. Menschen tun sich schwer sich die URL zu merken und Suchmaschinen sind bei der Indizierung ziemlich zurückhaltend.

Der meist gewählte Lösungsansatz

Bei diesem Problem ist der meist gewählte Lösungsansatz die Verwendung von mod_rewrite. Wenn das Modul aktiviert ist, lassen sich damit Requests umleiten ohne dass der Benutzer etwas davon bemerkt.

Beispielsweise kann der Request <kbd>http://www.meinedomain.com/artikel/0815</kbd> intern umgelegt werden auf <kbd>http://www.meinedomain.com/index.php?artikel=0815</kbd><kbd></kbd>

Dem Benutzer bleibt dieser Vorgang verborgen.Vermutlich wäre ich bei mod_rewrite geblieben hätte es bei dem Hoster nicht Probleme gemacht. Am lokalen Test-Server lief alles einwandfrei, aber nicht beim Provider.

Alternativlösung

Zu URL-Rewriting gibt es allerdings eine Alternative. Auf den meisten Servern befüllt PHP die globale Variable $_SERVER['PATH_INFO'].

Werden in der URL nach dem Script nicht mit Fragezeichen abgetrennte Parameter übergeben, sondern ein "Pfad", befüllt PHP die Variable mit dieser Information.

Beispielsweise wäre in dem Script "meinscript.php" die Variable $_SERVER['PATH_INFO'] mit "/artikel/0185" befüllt wenn das Script mit <kbd>http://www.meinedomain.com/meinscript.php/artikel/0815/</kbd> aufgerufen wird. Schaut doch schon viel schöner aus als <kbd>http://www.meinedomain.com/meinscript.php?artikel=0815</kbd>, oder?

Das Script muss dann nur noch die PATH_INFO nehmen, und entsprechend parsen. Ich verwende dazu einfach einfach explode.

PHP:$pathsegments = explode('/', $_SERVER['PATH_INFO']);

teilt die elemente des Pfades in das Array auf, in dem Beispiel also

[0] => 'artikel'
[1] => '0815'

Der virtuelle Pfad lässt sich so recht einfach verarbeiten.

Eines ist allerdings noch nicht schön in dem Beispiel oben: Nämlich dass die Extension ".php" mit in der URL steht.

<kbd>http://www.meinedomain.com/meinscript/artikel/0815/</kbd>

wäre schöner.

Auch das ist recht einfach. Jetzt geht's aber mehr um den Indianer als um PHP.

Ob der Aufruf von Scripts ohne Extension zulässig ist hängt von der Apache-Konfiguration ab. Dazu ist Multi-View bzw. ForceType zuständig.

Hat der Apache multi-view eingeschaltet, hat sich das Problem schon von selbst gelöst. Wird keine Extension angegeben verhandelt der Browser dann mit dem Apache welche "Version" der Datei er will. Da in unserem Fall nur ein File mit dem Namen existiert, und zwar als PHP-File wird er das nehmen. Ob Multi-View eingeschaltet ist lässt sich einfach feststellen: Einfach das Script ohne Extension aufrufen. Wird es ausgeführt, ist alles erledigt.

Wenn nicht, kommt etwas Konfiguraitonsarbeit. Entweder Multi-View wird eingeschaltet, oder es kommt ein kleines Rewrite zum Einsatz:

Diese kleine mod_rewrite regel ist nur notwendig, wenn der Apache Multi-View nicht konfiguriert hat:

In der .htaccess sind dann folgende Zeilen einzutagen:

RewriteEngine onRewriteBase /RewriteRule ^meinscript$ meinscript.php [QSA,L]
RewriteRule ^meinscript/(.*)$ meinscript.php/$1 [QSA,L]

Diese Zeilen veranlassen den Apache einen Aufruf von "meinscript" ohne Angabe von Extension intern auf meinscript.php umzulegen. Die erste RewriteRule übernimmt Aufrufe ohne nachfolgendem Pfad oder URL, die zweite mit Parametern.



Kommentare


Kommentar schreiben...


Anzeige: 1 - 1 von 1.
 
Sunday, 11. 03 07 22:36
Heinz Otto
aus test heinz.otto@gmx.de    Website   

Hallo,

sie wollen eine alternative nutzen ohen mod_rewrite, nutzen unten aber für eine Umleitung auch eine solche Lösung, das macht doch keinen Sinn...

Kommentar:
Die Idee dahinter ist, dass mod_rewrite nur verwendet wird um den script-namen ohne Extension umzusetzen, nicht jedoch die Parameter dahinter. Gleiches lässst sich mit der .htacess-Option ForceType erreichen, die aber bei providern oft deaktiviert ist. Aber ich werde ein entsprechendes Beispiel hinzufügen. Dann ists komplett mod_rewrite-los ;)

 
 

Kommentar schreiben