#apache #.htaccess #mod-rewrite
Вопрос:
У меня была настройка, в которой вместо того, чтобы перенаправлять пользователя несколько раз, я устанавливал переменную среды, если какая-либо из моих перезаписей прошла, а затем проверял указанную переменную в конце, вот так:
RewriteRule ^(.*)á(.*)$ $1a$2 [NC,N,E=redir:1] # Remove accented character and set var
RewriteCond %{ENV:redir} 1 # Check for var
RewriteRule ^(.*)$ $1 [R=301,L,END] # Redirect
Совсем недавно, имея дело с завершающими косыми чертами, я заметил некоторое странное поведение с дополнительным эффектом следующих двух правил перезаписи, которые доставляли мне настоящую головную боль. Рассмотрим следующий файл .htaccess:
RewriteEngine ON
RewriteBase /
RewriteRule ^(. )([^/])$ $1$2/ # Add trailing slash if missing
RewriteRule ^(.*)$ $1 [R=301] # Redirect
Я понимаю, что приведенный выше код в противном случае не работает и вызовет цикл перенаправления, это просто ради этой демонстрации
Если я отправлю запрос на mysite.com/foo
, все будет работать так, как ожидалось, я получу перенаправление на /foo/
. Но, если я отправлю запрос /foo/bar
, сервер ответит перенаправлением на /foo/bar//bar
, что, похоже, не имеет никакого смысла.
Я совершенно не понимаю, в чем может быть причина и/или как это исправить: объяснение явлений или, возможно, менее изменчивый способ сделать это был бы действительно признателен!