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 RewriteCondauf meinen lokalen Systemen gut funktioniert, aber auf einem Testserver fehlschlägt. Das Apache-Debug-Protokoll sagt ausdrücklich, dass das " -fMuster nicht übereinstimmt" für diese Bedingung. Wenn ich diese Bedingung einfach entferne, funktioniert die Umschreiberegel einwandfrei und das Bild wird bereitgestellt.
Was kann -fbei eindeutig vorhandenen Dateien zum Fehlschlagen führen?
FollowSymLinksist 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 RewriteCondals:
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 -fRegel sieht die umgeschriebene Datei nicht, obwohl dies der RewriteRuleFall ist. Die Frage ist warum?