Неожиданный суффикс в uri при работе с завершающими косыми чертами в .htaccess

#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 , что, похоже, не имеет никакого смысла.

Я совершенно не понимаю, в чем может быть причина и/или как это исправить: объяснение явлений или, возможно, менее изменчивый способ сделать это был бы действительно признателен!