Рейтинг:1

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

флаг dj

%{REQUEST_FILENAME} содержит такую ​​строку:

/веб/вебрут/index.php

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

RewriteCond %{REQUEST_FILENAME}.php -f

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

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

/веб/вебрут/index.php.php

Мне не хватает чего-то простого, я уверен в этом, но я просто не знаю, что это такое.

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

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
Правило перезаписи ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]
Рейтинг:1
флаг kz

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

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

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

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

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

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

Jeff avatar
флаг dj
Я вижу, ты знаешь свое дело. Я буду смотреть на это еще несколько часов, пока не выясню это. Я думаю, вы говорите, что переменная изменяется путем добавления `.ext`, но я не могу найти документацию об этом поведении где-либо, кроме как на форумах SE. РЕДАКТИРОВАТЬ: Да, хорошо, я понял. Спасибо!
флаг kz
@Jeff Сама переменная (т.е. `REQUEST_FILENAME`) не изменяется, только _TestString_ (первый аргумент директивы `RewriteCond`) - как вы указываете в вопросе. По сути, это проверка того, существует ли запрошенный URL + `.php` в виде физического файла.Хотя `REQUEST_FILENAME` не является строго правильной переменной для использования здесь (хотя работает в _большинстве_ случаев), как указано в связанном вопросе. («REQUEST_FILENAME» — это «файл», на который сопоставляется запрошенный URL-адрес.)
Jeff avatar
флаг dj
Ну, раз уж я, конечно, хочу использовать в своем коде строго правильные переменные, то вот эта: `%{DOCUMENT_ROOT}%{REQUEST_URI}.php -f`?
флаг kz
@Jeff Да, и соответствующим образом измените строку _substitution_ `RewriteRule`. т.е. `RewriteRule ^ %{REQUEST_URI}.php [L]`
Jeff avatar
флаг dj
Потрясающе, большое спасибо!
флаг kz
@Jeff Регулярное выражение `!\.\w{2,4}$` исключает все запросы, которые уже содержат то, что _похоже_ на расширение файла. Это просто оптимизация, чтобы предотвратить ненужное тестирование всех статических ресурсов (изображения, CSS, JS и т. д.), чтобы увидеть, существует ли `image.jpg.php` и т. д. (проверки файловой системы относительно дороги). Файлы _обычно_ не имеют двух расширений, таких как `exists.qqq.php`, так что обычно это не проблема. Но это всего лишь оптимизация, поэтому ее можно удалить. Вы можете добиться аналогичной оптимизации, исключив подкаталог, в котором хранятся все ваши статические ресурсы.
Jeff avatar
флаг dj
Хорошая вещь. Разве строка `RewriteCond` перед регулярным выражением исключения уже не исключает все эти дополнительные тесты для других статических ресурсов (помимо файлов .html)?
флаг kz
@Jeff Директива RewriteRule обрабатывается первой. Предыдущие _условия_ обрабатываются только тогда, когда _pattern_ `RewriteRule` совпадает. Если `RewriteRule` _pattern_ не работает, то все правило пропускается и обработка продолжается...
Jeff avatar
флаг dj
Вау, я этого не знал. Еще раз спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.