Задать вопрос
Morozov_Evgeny
@Morozov_Evgeny

Объясните магию: как работает это правило RewriteRule?

Столкнулся с совершенно волшебным поведением этого правила в 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} //) правило работает?
Можно объяснить по шагам?
Оно работает в несколько проходов или в один?
  • Вопрос задан
  • 139 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
shambler81
@shambler81 Куратор тега htaccess
все просто это правило удаляет два слеша подряд, если их 2
Если еж их больше то хтаксесс крутится по кругу пока не остановится и все урлы после прохождения останутя неизменными ( это не к правила а вообще к .htaccess относится). Так что тут все лочно работает, магии нет.
И если вы понимаете что .htaccess гоняется кругами то магия исчезает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы