Почему это вызывает бесконечный цикл запросов?

Ранее сегодня я помогал кому-то с вариантом использования .htaccess , и придумал решение , которое работает, но сам не могу его понять!

Он хотел иметь возможность:

  • Просматривать index.php? id = 3 & cat = 5
  • См. адресную строку читать index / 3/5 /
  • Будет ли обслуживаться контент из index.php? id = 3 & cat = 5

Последние два шага довольно типичны (обычно от пользователя, вводящего index / 3/5 в первую очередь), но первый шаг был необходим, потому что на его сайте все еще были ссылки в старом формате, и по какой-то причине он не мог их изменить. Поэтому ему нужно было поддерживать оба формата URL, и чтобы пользователь всегда в конечном итоге видел предварительно заданный формат.

После долгих разговоров мы пришли к следующему . htaccess файл:

RewriteEngine on

# Prevents browser looping, which does seem
#   to occur in some specific scenarios. Can't
#   explain the mechanics of this problem in
#   detail, but there we go.
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

# Hard-rewrite ("[R]") to "friendly" URL.
# Needs RewriteCond to match original querystring.
# Uses "?" in target to remove original querystring,
#   and "%n" backrefs to move its components.
# Target must be a full path as it's a hard-rewrite.
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
RewriteRule ^index\.php$ http://example.com/index/%1/%2/? [L,R]

# Soft-rewrite from "friendly" URL to "real" URL.
# Transparent to browser.
RewriteRule ^index/(\d+)/(\d+)/$ /index.php?id=$1&cat=$2

Хотя это может показаться несколько странным вариантом использования (« почему бы просто не использовать правильные ссылки в первую очередь? », вы можете спросить), просто используйте Это. Независимо от исходного требования, именно такой сценарий сводит меня с ума.

Без первого правила клиент входит в цикл запроса, пытаясь повторно выполнить GET / index / X / Y / и получение 302 каждый раз. Проверка REDIRECT_STATUS заставляет все работать без сбоев. Но я бы подумал, что после последнего правила больше не будут обслуживаться правила, клиент не будет Не делайте больше запросов (обратите внимание, нет [R] ), и все будет просто подливкой.

Итак ... почему это приведет к возникновению цикла запроса, когда я беру первое правило?

5
задан Community 23 May 2017 в 12:04
поделиться