Назад | Перейти на главную страницу

Может ли mod_rewrite отличить «пользовательский» запрос от внутреннего перенаправления?

На самом деле простой вопрос.

После внутреннего перенаправления исходный «контекст» исчезает. Я хотел бы знать, есть ли переменная или флаг, которые позволяют мне проверять исходный запрос вместо перезаписанного запроса. Псевдокод:

 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]

Это должно сработать.