Столкнулся с совершенно волшебным поведением этого правила в htaccess:
RewriteCond %{THE_REQUEST} //
RewriteRule ^(.*)$ /$0 [R=302,L]
Что делает это правило: если в запросе есть несколько слешей подряд (после имени домена, в середине или в конце), то убираем дубли слешей и оставляем только один слеш.
У этого правила волшебное поведение.
Содержимое файла htaccess
=================================================================================
AddDefaultCharset utf-8
DirectorySlash Off
RewriteEngine On
# Если в запросе есть несколько слешей подряд (после имени домена, в середине или в конце), то убираем дубли слешей и оставляем только один слеш
RewriteCond %{THE_REQUEST} //
RewriteRule ^(.*)$ /$0 [R=302,L]
# Если запрос соответствует директории (например, morozov.one/pages или morozov.one или morozov.one/) и внутри этой директории есть файл index.html, то выполняем перенаправление: добавляем в конец запроса /index.html
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ %{REQUEST_URI}/index.html [R=302,L]
=================================================================================
И вот тут начинается магия!
Запрос: morozov.one/pages/
Итоговый адрес: morozov.one/pages/index.html
Всё ОК! Первое правило не сработало, второе сработало.
Идём далее.
Запрос: morozov.one/pages////
Итоговый адрес: morozov.one/pages/index.html
Всё ОК! Первое правило сработало, второе сработало.
Идём далее.
Запрос: morozov.one
Итоговый адрес: morozov.one/index.html
Магия!
По логике, итоговый запрос должен иметь вид:
morozov.one//index.html (два слеша)
Первое правило не выполнится, ведь в исходном запросе нет парных слешей, а второе правило выполнится.
Но на практике два слеша не получается,
будто бы правило %{THE_REQUEST} // срабатывает в самом конце! Но оно же в начале стоит!
Вопросы:
Как это (%{THE_REQUEST} //) правило работает?
Можно объяснить по шагам?
Оно работает в несколько проходов или в один?