mod_rewrite REQUEST_FILENAME enthält keinen absoluten Pfad

7

Ich habe ein Problem mit einem Dateitestvorgang in einem mod_rewrite RewriteCond-Eintrag, der prüft, ob er %{REQUEST_FILENAME}vorhanden ist. Es scheint, dass %{REQUEST_FILENAME}ich keinen absoluten Pfad habe, sondern einen Pfad, der auf dem verwurzelt ist DocumentRoot.

Aufbau

Ich habe dies in einem <VirtualHost>Block in meiner Apache 2.2.9-Konfiguration:

RewriteEngine on
RewriteLog /tmp/rewrite.log
RewriteLogLevel 5

#push virtually everything through our dispatcher script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^/]*)/?([^/]*) /dispatch.php?_c=$1&_m=$2 [qsa,L]

Diagnose versucht

Diese Regel ist häufig genug, um Anforderungen für nicht vorhandene Dateien oder Verzeichnisse über ein Skript weiterzuleiten. Das Problem ist, es Brennen , selbst wenn eine Datei tut exist.

Wenn ich die Regel entferne, kann ich normale Dateien problemlos anfordern. Mit der geltenden Regel werden diese Anforderungen jedoch an dispatch.php weitergeleitet

Protokollablaufverfolgung neu schreiben

Folgendes sehe ich im rewrite.log

init rewrite engine with requested uri /test.txt
applying pattern '^/([^/]*)/?([^/]*)' to uri '/test.txt'
RewriteCond: input='/test.txt' pattern='!-f' => matched
RewriteCond: input='/test.txt' pattern='!-d' => matched
rewrite '/test.txt' -> '/dispatch.php?_c=test.txt&_m='
split uri=/dispatch.php?_c=test.txt&_m= -> uri=/dispatch.php, args=_c=test.txt&_m=
local path result: /dispatch.php
prefixed with document_root to /path/to/my/public_html/dispatch.php
go-ahead with /path/to/my/public_html/dispatch.php [OK]

Für mich sieht es so aus, als würde REQUEST_FILENAME als Pfad vom Dokumentstamm und nicht vom Dateisystemstamm dargestellt, was vermutlich der Grund dafür ist, dass der Dateitestoperator fehlschlägt.

Alle Hinweise zur Lösung dieses dankbar erhaltenen ...

Paul Dixon
quelle

Antworten:

3

Ich habe eine Weile gebraucht, um das herauszufinden, aber der Grund ist in der mod_rewrite-Dokumentation angegeben :

" REQUEST_FILENAME Auf den vollständigen lokalen Dateisystempfad zu der Datei oder dem Skript, der / der der Anforderung entspricht, REQUEST_FILENAMEwird verwiesen , wenn dies bereits vom Server zu diesem Zeitpunkt festgelegt wurde . Andernfalls wird, z. B. bei Verwendung im Kontext eines virtuellen Hosts , derselbe Wert wie verwendet REQUEST_URI."

Deshalb funktioniert .htaccesses in der conf-Datei des vhost, aber nicht in dieser. (Und deshalb funktioniert das Hinzufügen von DOCUMENT_ROOT auch um das Problem herum).

zpea
quelle
1

Ich habe dies behoben, indem ich den Dokumentstamm explizit in die Bedingung geschrieben habe

RewriteCond /path/to/my/public_html%{REQUEST_FILENAME} !-f
RewriteCond /path/to/my/public_html%{REQUEST_FILENAME} !-d
Paul Dixon
quelle
2
Dies ist seltsam, wenn man bedenkt, dass in der Dokumentation angegeben ist, dass REQUEST_FILENAME "den vollständigen Pfad des lokalen Dateisystems" enthält. Haben Sie es mit% {SCRIPT_FILENAME} versucht?. Wie auch immer ... erwägen Sie die Verwendung von% {DOCUMENT_ROOT} anstelle eines Literalpfads für eine allgemeinere Lösung.
GetFree
Ich weiß, daher meine Verwirrung. Ich denke, es könnte sein, dass ich dies zuvor über .htaccess getan habe, aber diesmal die Regeln in die vhost-Konfiguration eingefügt habe - vielleicht funktioniert es auf dieser Ebene anders. Vielen Dank für den DOCUMENT_ROOT-Tipp.
Paul Dixon
Es ist eine alte Frage, aber können Sie sie als ausgewählte Antwort bearbeiten, um% {DOCUMENT_ROOT} zu verwenden?
Tokand
0
RewriteCond     %{REQUEST_URI}     ^(/pathinfo/|/pathinfo)(.*)$
RewriteRule     .*          %{DOCUMENT_ROOT}%{REQUEST_URI} [L]

quelle