На самом деле простой вопрос.
После внутреннего перенаправления исходный «контекст» исчезает. Я хотел бы знать, есть ли переменная или флаг, которые позволяют мне проверять исходный запрос вместо перезаписанного запроса. Псевдокод:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .+ public/$0.html [L]
RewriteCond %{WHAT_USER_TYPED} ^public/(.+)\.html
RewriteRule .+ - [R=404,L]
В этом примере, когда я набираю mywebsite.com/slug
запрос переписывается в путь public/slug.html
. Теперь происходит внутреннее перенаправление, и мой путь может соответствовать второму условию public/(.+)\.html
, и возвращает 404. Я не этого хочу. Итак, я хотел бы знать, есть ли какое-то решение для этого.
Еще одна причина, по которой вам следует избегать добавления rewriterules в файлы .htaccess. Если бы вы сделали это в контексте главного сервера, у вас не было бы этой проблемы. В контексте каталога или в файле .htaccess каждая перезапись вызывает внутренний подзапрос.
Есть параметр, содержащий исходный запрос, это "% {THE_REQUEST}"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) public/$0.html?redir [L]
RewriteCond %{THE_REQUEST} GET\ /public
RewriteRule .* - [R=404,L]
Это должно сработать.