Я пытаюсь ввести красивые URL-адреса:
RewriteRule ^(.*).html$ index.php?arianne_url=content/$1 [L]
И я хочу внешне переписать доступ к URL-адресам в старом стиле:
RewriteCond %{QUERY_STRING} arianne_url=content/([^&]*)
RewriteRule ^.* /%1.html? [R=301]
Проблема в том, что это заканчивается бесконечным циклом.
Я пытался определить env и проверить его, но это все равно приводит к бесконечному циклу
RewriteRule ^(.*).html$ index.php?arianne_url=content/$1 [L,env=arianne:rewrite]
RewriteCond %{env:arianne} ^$
RewriteCond %{QUERY_STRING} arianne_url=content/([^&]*)
RewriteRule .* /%1.html? [R=301]
Я должен сделать это в .htaccess, так как у меня нет доступа к файлам конфигурации сервера.
Редактировать:
Лог-файл: http://pastebin.ca/1927769
# enable nice urls
RewriteRule ^(.*).html$ index.php?arianne_url=content/$1 [L,env=arianne:rewrite]
# Redirect old style request to new nice url
RewriteCond %{env:arianne} ^$
RewriteCond %{QUERY_STRING} arianne_url=content/([^&]*)
RewriteRule ^.* /%1.html? [R=301,L]
Переменные Apache ENV, установленные при перезаписи, не сохраняются при перенаправлении - поэтому, как только вы выполните R = 301, все вернется к исходному состоянию - запрос работает в совершенно новом контексте apache. Это ваш бесконечный цикл.
Если вы хотите сделать это с помощью перезаписи (что имеет смысл - чтобы браузер видел правильный URL-адрес), вам, вероятно, придется настроить либо файл cookie, а не пытаться использовать ENV, либо сделать некоторые забавные вещи с фактическими путями к серверу за кулисами , исключая некоторые из перенаправления.
Также - [L], как говорили другие, бесполезен - он приведет к тому, что остальные перезаписываемые файлы будут полностью проигнорированы.
Вы пробовали добавить «L» (последний) в свое RewriteRule? т.е.
RewriteRule ^. * /%1.html? [R = 301, L]
Это пометит правило как последнее правило и по существу эквивалентно оператору break в C. Как только это правило будет выполнено, оно прекратит сопоставление правил.
Не в этом ли причина?
Андрей