Ich habe ein seltsames Szenario mit dieser Umschreiberegel:
RewriteCond img/$2/$3/$4/$1 -f
RewriteRule ^img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ img/$2/$3/$4/$1 [L]
Die Verzeichnisstruktur hierfür ist (vereinfacht):
var/
images/
..
www/
.htaccess
img -> /var/images
Mit anderen Worten, Bilder werden außerhalb der Webroot in einem allgemeinen Datenspeicherbereich gespeichert und img
über eine symbolische Verknüpfung mit dem Webroot- Verzeichnis verknüpft. Bildnamen sind Hashes. Aus Effizienzgründen werden sie in einer dreistufigen tiefen Verzeichnishierarchie gespeichert. Zum Beispiel:
0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg
gespeichert ist bei
images/0a80/8e34/edaa/0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg
Die Umschreiberegel schreibt einfach den Dateinamen in die verschachtelte Verzeichnisstruktur.
Das Seltsame ist, dass das RewriteCond
auf meinen lokalen Systemen gut funktioniert, aber auf einem Testserver fehlschlägt. Das Apache-Debug-Protokoll sagt ausdrücklich, dass das " -f
Muster nicht übereinstimmt" für diese Bedingung. Wenn ich diese Bedingung einfach entferne, funktioniert die Umschreiberegel einwandfrei und das Bild wird bereitgestellt.
Was kann -f
bei eindeutig vorhandenen Dateien zum Fehlschlagen führen?
FollowSymLinks
ist erlaubt. Apache Version 2.2.22-6ubuntu2 über apt installiert und kaum verändert. Funktioniert mit einer lokalen Installation von Apache 2.2.23 (über Homebrew). Es konnten keine signifikanten Änderungen zwischen den beiden Versionen festgestellt werden, die dies verursachen sollten.
Einige weitere möglicherweise wichtige Details zur tatsächlichen Verzeichnisstruktur:
$ ls -l /var/www/myapp/current
[snip] /var/www/myapp/current -> /var/www/myapp/releases/20130418090750
$ ls -la /var/www/myapp/current/webroot
[snip]
[snip] .htaccess
[snip] img -> /usr/local/var/myapp/images
Die Apache-Webroot ist wie folgt konfiguriert:
DocumentRoot /var/www/myapp/current/webroot
Wenn ich das schreibe RewriteCond
als:
RewriteCond /usr/local/var/myapp/images/$2/$3/$4/$1 -f
Es klappt. Ich würde es jedoch vorziehen, absolute Pfade nicht fest zu codieren, wenn dies überhaupt vermeidbar ist.
Darf Apache durch die verschiedenen Ebenen von Symlinks verwirrt sein?
RewriteCond
-f
Regel sieht die umgeschriebene Datei nicht, obwohl dies der RewriteRule
Fall ist. Die Frage ist warum?