neues Zend Framework Rewrite

Seit einiger Zeit findet sich im Quickstart Tutorial (englisch) des Zend Frameworks eine neue verbesserte RewriteRule:

Wird das mod_rewrite Modul unter Apache verwendet, wird empfohlen, eine .htaccess Datei mit folgendem Inhalt im Hauptverzeichnis der Domain (DocumentRoot) abzulegen:

# public/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

Was passiert hier nun?

Die Umgebungsvariable REQUEST_FILENAME beinhaltet laut Apache-Dokumentation den vollen Pfad zur Datei oder zum Script entsprechend der Anfrage (z.B. /var/www/domain.tld/public/css/style.css).

Die drei Bedingungen (RewriteCond) prüfen nun, ob diese/s Datei/Script eine tatsächlich existierende Datei (s), symbolischer Link (l) oder ein Verzeichnis (d) sind. Wenn ja: leite die Anfrage unverändert durch und beachte keine weiteren Regeln ([L] = Last/Letzte Regel), also kein Rewrite und Ende der Prüfung. Wenn nein: Schreibe die Anfrage zu /index.php um. Das NC bewirkt, dass nicht zwischen Klein- und Großschreibung unterschieden wird (NC = no case-sensitive).

Besonderheit bei Deklaration der Rewrite Bedingungen/Regeln innerhalb eines VirtualHost
Die zuvor aufgezeigten Bedingungen gelten für die Deklaration innerhalb einer .htaccess Datei. Gleichermaßen kann das Rewriting natürlich auch innerhalb einer VirtualHost Definition deklariert werden.

Jedoch ist bei einer Deklaration innerhalb eines VirtualHosts zu beachten, dass die Umgebungsvariable REQUEST_FILENAME hier nicht den vollen, sondern den relativen Pfad vom DomainRoot beinhaltet.

In den Bedingungen muss daher die Umgebungsvariable DOCUMENT_ROOT zusätzlich vorangestellt werden!
Der Rest bleibt erhalten.

# innerhalb VirtualHost Deklaration
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -s [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -l [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]