Was bedeutet %{REQUEST_FILENAME}.ext? Warum die zusätzliche Endung .ext?

Was bedeutet %{REQUEST_FILENAME}.ext? Warum die zusätzliche Endung .ext?

Das %{REQUEST_FILENAME}enthält eine Zeichenfolge wie diese:

/web/webroot/index.php

Ich sehe, dass viele Leute empfehlen, zu testen, ob eine Datei existiert und die Erweiterung .php wie folgt hat:

RewriteCond %{REQUEST_FILENAME}.php -f

Ist das .php„nach“ nicht %{REQUEST_FILENAME}überflüssig? Die Variable sollte doch bereits das enthalten .php, oder?

Das Hinzufügen von .php„after“ %{REQUEST_FILENAME}scheint dazu zu führen, dass die TestString-Prüfung eine zusätzliche .php hinzufügt, etwa so:

/web/webroot/index.php.php

Ich übersehe etwas Einfaches, da bin ich mir sicher, aber ich weiß einfach nicht, was es ist.

Der Kontext ist dieser:

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
RewriteRule ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Antwort1

Ist das .php„nach“ nicht %{REQUEST_FILENAME}überflüssig? Die Variable sollte doch bereits das enthalten .php, oder?

Nun, ja und nein, es hängt davon ab, was Sie versuchen zu tun.

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Mit dieser Regel können Sie URLs ohne Erweiterung anfordern, z. B. „ /indexoder“ /foo, wodurch die Anforderung intern in „ /index.phpund“ umgeschrieben wird /foo.php.

In diesem Fall REQUEST_FILENAMEist eine Zeichenfolge der Form /web/webroot/index. Es wird also getestet, ob sie /web/webroot/index.phpexistiert, bevor sie in dieselbe umgeschrieben wird. Wenn Sie /index.phpdann dieZustandschlägt fehl und es erfolgt kein Neuschreiben (was richtig ist).

Diese Regel ist jedoch nicht ganz korrekt und kann unter bestimmten Umständen zu einer Umschreibschleife führen. Siehe die folgende verwandte Frage:

verwandte Informationen