Назад | Перейти на главную страницу

Предотвратить цикл RewriteRule в .htaccess

Я пытаюсь ввести красивые 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. Как только это правило будет выполнено, оно прекратит сопоставление правил.

Не в этом ли причина?

Андрей