У меня была похожая проблема.У меня есть система управления контентом, написанная на PHP и основанная на парадигме Model-View-Control.Самая базовая часть - mod_rewrite
.Я успешно запретил доступ к файлам PHP по всему миру.Трюк имеет имя THE_REQUEST
.
В чем проблема?
Модуль перезаписи перезаписывает URI.Если URI соответствует правилу, оно переписывается и другие правила применяются к новому переписанному URI.Но!Если согласованное правило заканчивается на [L]
, двигатель фактически не останавливается, а запускается снова.Тогда новый URI больше не соответствует правилу, оканчивающемуся на [L]
, продолжается и соответствует последнему.Результат?Программист начинает произносить плохие слова на странице с неожиданной ошибкой 404.Однако компьютер делает то, что вы говорите, а не делает то, что вы хотите.У меня было это в моем .htaccess
файле:
RewriteEngine On
RewriteBase /
RewriteRule ^plugins/.* pluginLoader.php [L]
RewriteCond %{REQUEST_URI} \.php$
RewriteRule .* index.php [L]
Это неправильно.Даже URI, начинающиеся с plugins/
, переписываются в index.php
.
Решение
Правило следует применять тогда и только тогда, когда оригинал - не переписан -URI соответствует правилу.К сожалению, mod_rewrite
не предоставляет никакой переменной, содержащей исходный URI, но предоставляет некоторую переменную THE_REQUEST
, которая содержит первую строку заголовка HTTP-запроса.Эта переменная инвариантна.Он не изменяется, пока работает механизм перезаписи.
...
RewriteCond %{THE_REQUEST} \s.*\.php\s
RewriteRule \.php$ index.php [L]
Регулярное выражение отличается.Он применяется не только к URI, но и ко всей первой строке заголовка, что означает что-то вроде GET /script.php HTTP/1.1
.Но на этот раз критическое правило применяется только в том случае, если пользователь явно запрашивает какой-либо PHP-скрипт напрямую.Переписанный URI не используется.