Что означает %{REQUEST_FILENAME}.ext? Почему дополнительное окончание .ext?

Что означает %{REQUEST_FILENAME}.ext? Почему дополнительное окончание .ext?

Содержит %{REQUEST_FILENAME}строку следующего вида:

/web/webroot/index.php

Я вижу, что многие рекомендуют проверять, существует ли файл и имеет ли он расширение .php, например так:

RewriteCond %{REQUEST_FILENAME}.php -f

.phpРазве after не %{REQUEST_FILENAME}избыточно? Переменная уже должна содержать .php, верно?

Похоже, добавление .phpafter %{REQUEST_FILENAME}заставит проверку TestString добавить дополнительный .php, например так:

/web/webroot/index.php.php

Я уверен, что мне не хватает чего-то простого, но не знаю, чего именно.

Контекст таков:

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

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

решение1

.phpРазве after не %{REQUEST_FILENAME}избыточно? Переменная уже должна содержать .php, верно?

Ну, и да, и нет, все зависит от того, что вы пытаетесь сделать.

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

Это правило позволяет вам запрашивать URL-адреса без расширений, например, /indexили /foo, и это внутренне переписывает запрос на /index.phpи /foo.phpсоответственно.

В этом случае, REQUEST_FILENAMEэто строка формы /web/webroot/index. Так что это тестирование, которое /web/webroot/index.phpсуществует до перезаписи в то же самое. Если бы вы запросили, /index.phpтосостояниезавершается неудачей и перезапись не происходит (что верно).

Однако это правило не совсем верно и может вызвать цикл перезаписи при определенных условиях. См. следующий связанный вопрос:

Связанный контент