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.

















