
Содержит %{REQUEST_FILENAME}
строку следующего вида:
/web/webroot/index.php
Я вижу, что многие рекомендуют проверять, существует ли файл и имеет ли он расширение .php, например так:
RewriteCond %{REQUEST_FILENAME}.php -f
.php
Разве after не %{REQUEST_FILENAME}
избыточно? Переменная уже должна содержать .php
, верно?
Похоже, добавление .php
after %{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
тосостояниезавершается неудачей и перезапись не происходит (что верно).
Однако это правило не совсем верно и может вызвать цикл перезаписи при определенных условиях. См. следующий связанный вопрос: