PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

mod_rewrite - Trailing Slash

Wir hören ja immer wieder, dass sich manchmal die Technologie hinter einer Webseite ändert und nichts wäre schlimmer, als die kostbaren Bookmarks unserer User, die wieder in die dritte Navigtionsstruktur deep-linken zu vergrämen, weil jetzt plötzlich die Seite login.php eben login.jsp heißt. Also ist es besser, wenn man die Extension direkt mal in die Tonne wirft und nur noch URLs nach dem Motto www.phpblogger.net/login hat. Noch besser und da streiten die Geister, sind Verzeichnisse. www.phpblogger.net/login/

Warum weiß ich nicht, aber ich wollte jedenfalls in meiner Applikation, dass es Verzeichnisse sind. Doch dann stellte ich fest, dass zum Beispiel der Internet Explorer in der Adress-History plötzlich den Trailing Slash vermissen ließ und ich damit aufgeschmissen wäre… Ihr fragt euch sicher, was das Problem ist, weil die meisten Webserver mittlerweile in einem solchen Fall nach einem Verzeichnis mit dem Namen suchen, wenn die Datei nicht gefunden wird, doch was ist wenn weder die Datei noch das Verzeichnis physikalisch auf dem Datenträger existieren?

Wie bei den meisten CMS gibt es bei mir auch nur eine zentrale Datei, die aufgerufen wird, nennen wir sie index.php. Also habe ich mit mod_rewrite jeden Verzeichnisaufruf nach /*/ nach index.php umgeleitet. Doch was ist jetzt, wenn jemand eben nur /* eingibt. Er bekommt erstmal einen 404-Fehler. Weil der Server findet ja weder die Datei noch ein entsprechendes Verzeichnis.

Nach einigem Suchen, fand man in der Apache Dokumentation nur eine Lösung, die bei existierenden Verzeichnissen umleitet. Also musste wohl eine Custom-Lösung her.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [L,R=301]

Die erste Cond checkt, ob es vielleicht doch eine exisitierende Datei (bsp. eine Bild-Datei) ist, die hier angefragt wird. Die zweite Cond checkt auf den fehlenden Slash am Ende und die Rule leitet um auf die entsprechende Seite und beendet das Rewriting. Die Suche hat mich ein halbes Jahr gedauert, bis ich endlich eine funktionsfähige Version hatte, vorher wurde ich jedes Mal wieder von den 500-Server-Errors gebremst.

Dazu noch einen Tipp, den ich auch erst kürzlich in dem Zusammenhang gelernt habe:

RewriteEngine On
RewriteLog "pfad/logs/rewrite.log"
RewriteLogLevel 9

hilft ungemeint. Damit schreibt der Apache nämlich ein genaues Logfile über sein rewrite Verhalten und warum er jetzt was ersetzt und was er ersetzt.

  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

Duddle meint dazu:

18. Juni 2007 um 09:00

Ein Logging für Rewrites! Danke, danke, danke :-) Man lernt nur dazu…

Frank meint dazu:

12. Juli 2007 um 15:37

Ich mache es folgendermaßen:
RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [R=301,L]

Welches ist die bessere Lösung?

phil meint dazu:

12. Juli 2007 um 16:59

Das Problem was ich mit deiner Lösung hätte, ist, dass ich Dateien, die existieren und die damit keinen Trailingslash benötigen nicht abfange. Ich möchte ja gerade, dass z.B. ./style/content.css auch als .css geladen wird und nicht einen Rewrite auf content.css/ bekommt. Oder kannst du es erzwingen, dass alle Links, die intern sind, immer mit ./ oder mit / anfangen, was du ja dann abfängst?

Ich benutze das halt in einem CMS und bin dann irgendwann mal nicht mehr der einzige, der da Links setzt und das andere ist halt dann auch ein korrekter Link, oder?

Frank meint dazu:

13. Juli 2007 um 07:51

OK, richtig - dann habe ich es nun verstanden. Danke nochmal für die Antwort. Bei meiner Lösung wird im / angefügt, was natürlich für reale Dateien schlecht wäre.

Frank meint dazu:

13. Juli 2007 um 07:58

Habe das nochmal mit meinen Einstellungen geprüft, es werden alle Dateien, die sich als Link oder in einem Verzeichnis befinden, auch so geladen, also es wird z.B. /theme/new/style.css als .css geladen, gleiches gilt für .phps.

phil meint dazu:

13. Juli 2007 um 14:51

Oh ok, du überprüfst noch, ob die URL keinen Punkt enthält… mit dem [^\.] vermute ich… Dann dürfte es bei Verzeichnissen, die einen “.” enthalten nicht funktionieren, was aber auch eher eine seltene Anwendung ist, aber manchmal laden die Leute halt sowas wie “Bilder_vom_30.06.07″ hoch… Das dürfte dann nicht mehr funktionieren… Aber das ist auch gerade mehr eine Vermutung, also kann man sagen, dass beide Versionen durchaus funktionieren dürften ;)

Willi meint dazu:

24. Oktober 2007 um 04:06

Hab ich schon erwähnt dass ich Leute, die ihre Erfahrungen Anderen mitteilen, verdammt gut leiden kann? Dafür gibts 100 Punkte von mir. Wenn ich mal im Lotto gewinne, bekommst du mit Sicherheit was ab :) Gesucht, gefunden!

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung