.htaccess RewriteRule mit dem Zend Framework ab Release 1.6

Gestern Abend schrieb Matthew Weier O'Phinney in der General Mailingliste vom Zend Framework einen interessanten Beitrag zur aktuell im Manual genannten RewriteRule. Mit Hilfe der Angabe einer RewriteRule in der .htaccess Datei wird der Apache Webserver angewiesen, welche Anfragen für den Front Controller umgeschrieben werden sollen, der sich in der Bootstrap Datei index.php im Document Root eures ZF Projektes befindet.

Bisher stand in der Schnellanleitung im Manual immer folgende Regel:

CODE:
  1. RewriteEngine on
  2. RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

Diese Regel besagt, dass alle Anfragen, die nicht auf einen der genannten Dateiendungen js, ico, gif, jpg, png und css enden, direkt an die Bootstrap Datei index.php und damit an den Front Controller umgeleitet werden sollen. Ich hatte mit dieser Regel schon immer meine Bauchschmerzen und habe die Liste der Dateiendungen schon um txt, xml und gz erweitert.

Selber habe ich bisher meistens folgende RewriteRule verwendet. Diese leitet alle Anfragen an index.php um, wenn die Bedingungen erfüllt ist, d.h. wenn die Datei wirklich existiert:

CODE:
  1. RewriteEngine on
  2.  
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4.  
  5. RewriteRule .* index.php

Aufgrund der Änderungen im Release 1.6 und dem Ausliefern des Dojo Pakets macht die zuerst genannte Regel jedoch zunehmend Probleme. Denn Dojos dijits verwenden auch HTML Templates, welche explizit nicht in der ursprünglichen Umschreiberegel enthalten sind. Würde man nun htm und html auch in die Regel mit aufnehmen, könnten wiederum Konflikte entstehen: falls jemand in seinen URLs gerne das ".htm" anhängt, um dem Nutzer und Google zu suggerieren, dass HTML Dateien ausgeliefert werden.

Also schlägt Matthew folgende neue Umschreiberegel vor:

CODE:
  1. RewriteEngine On
  2. RewriteCond %{REQUEST_FILENAME} -s [OR]
  3. RewriteCond %{REQUEST_FILENAME} -l [OR]
  4. RewriteCond %{REQUEST_FILENAME} -d
  5. RewriteRule ^.*$ - [NC,L]
  6. RewriteRule ^.*$ index.php [NC,L]

Sie besagt folgendes:

Wenn die angeforderte Ressource ({REQUEST_FILENAME}) ein gültiger symbolischer Link (-s), eine nicht leere Datei (-l) oder ein Verzeichnis (-d) ist, liefere die angeforderte Ressource aus (1. RewriteRule), andernfalls leite die URL an den Front Controller (index.php) um (2. Rewrite Rule). Ignoriere dabei die Groß- und Kleinschreibung ([NC]) und schließe die Bearbeitung sofort ab, sobald eine der Regeln zutrifft [L].

Diese Umschreiberegel ist deutlich komplexer, als jene, welche ich derzeit meistens verwende. Ich hab innerhalb der Regel in den (Klammern) auf die Bezugspunkte in der Regel verwiesen. Hilfreich beim Entschlüsseln ist übrigens auch http://www.modrewrite.de/mod_rewrite.syntax.phtml

Diese neuen Umschreiberegeln für den Apache Webserver sind meiner Meinung nach deutlich besser als der ursprüngliche Vorschlag und nehmen auch auf einige Besonderheiten Rücksicht. Mal schauen, wann die Schnellanleitung im Manual aktualisiert wird.

2 Antworten für “.htaccess RewriteRule mit dem Zend Framework ab Release 1.6”

  1. Tobi sagt:

    Mit den Beispiel-RewriteRegeln aus der Dokumentation war ich auch nicht zufrieden. Ich leite alle Dateizugriffe auf einen Ordner public weiter und habe für meinen Blog noch eine spezielle Regel um auf Dateien im Format bsp. http://blog.aditu.de/2008/09/11/lavenderimpressions.jpg zugreifen zu können. Die Dateiendungen htm und html hab ich dabei freigegeben. Aber Fall das es einmal Konflikte geben sollte, werd ich mir die Lösung auf jeden Fall nochmal notieren.

  2. Ralf Eggert sagt:

    Gut, letztendlich führen viele Weg nach Rom. Die im Manual vorhandene RewriteRegel wurde seit der ersten Version meiner Meinung nach mindestens 3 oder 4 mal überarbeitet. Und ich denke, auch die aktuelle lässt sich weiter verbessern... ;-)

Hinterlasse eine Antwort