Решение, приведенное ниже, сработало для меня.
RewriteEngine on
RewriteBase /
#rule1
#Guard condition: only if the original client request was for index.php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php [NC]
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$ [NC]
RewriteRule . /index/%1/%2/? [L,R]
#rule 2
RewriteRule ^index/(\d+)/(\d+)/$ /index.php?id=$1&cat=$2 [L,NC]
Вот то, что я думаю, происходит
Из приведенных выше шагов
- Перейдите к index.php? Id = 3 & cat = 5
- См. Строку адреса, прочитайте index / 3/5 /
- Получите контент из index.php? Id = 3 & cat =5
На шаге 1 правило 1 сопоставляется и перенаправляет на адресную строку и выполняет шаг 2.
На шаге 3 правило 2 теперь соответствует и переписывается в index.php.
Правила перезапускаются по причинам, указанным Дэвидом, но, поскольку THE_REQUEST
является неизменяемым после установки исходного запроса, он все равно содержит /index/3/5
, поэтому правило 1 не соответствует.
Правило 2тоже не совпадает, и результат index.php обслуживается.
Большинство других переменных являются изменяемыми, например REQUEST_URI
.Их модификация во время обработки правил и неправильное ожидание того, что сопоставления с шаблоном совпадают с исходным запросом, является обычной причиной для бесконечных циклов.
Иногда это кажется довольно эзотерическим, но я уверен, что есть логическая причина для этогосложность: -)
РЕДАКТИРОВАТЬ
Конечно, есть два разных запроса
Есть 2 клиентских запроса, исходныйиз шага 1 и из внешнего перенаправления в шаге 2.
То, что я упомянул выше, это то, что когда правило 2 совпадает со вторым запросом, оно переписывается в /index.php и вызывает внутреннее перенаправление.Это заставляет файл .htaccess для каталога /
снова загружаться (это может быть просто другой каталог с другими правилами .htaccess) и снова запускать все правила.
Итак... почему это привело бы к циклу запроса, когда я извлекаю первое правило?
Когда правила запускаются повторно, первое правило теперь неожиданно совпадает, в результате перезаписи Rule2, иделает перенаправление, вызывая бесконечный цикл.
Ответ Дэвида содержит большую часть этой информации, и именно это я имел в виду «по причинам, указанным Дэвидом».
Однако главное здесь заключается в том, что вам действительно нужно дополнительное условие, либо вашеусловие, которое останавливает дальнейшую обработку правила для внутренних перенаправлений, или мое, которое препятствует сопоставлению правила 1, необходимо для предотвращения бесконечного цикла.