Редирект в сочетании с условием перезаписи в htaccess

У меня есть веб-сайт, управляемый cms, без возможности изменить код. Чего я хочу добиться, так это создать дружественный URL-адрес, используя только модуль Apache mod-rewrite.

Проблема в том, что я создаю бесконечный цикл, потому что я сначала перенаправляю исходный URL-адрес (index.php?id=21) на дружественный (/friendly/), а затем переписываю часть «/friendly» обратно на «id=». 21 '

Я знаю, что в этом случае должно быть дополнительное условие или параметр, чтобы избежать зацикливания, но я не могу заставить работать одно из возможных решений.

Вот код:

RewriteCond %{query_string} ^id=21$ [NC]
RewriteRule /* /peuterspeelzaal? [R=301,L]

RewriteRule ^peuterspeelzaal$ index.php?id=21 [L]


person Robbert van den Bogerd    schedule 12.03.2010    source источник


Ответы (2)


Вам нужно посмотреть на строку запроса в < em>THE_REQUEST, чтобы увидеть, что изначально было запрошено:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /[^?\ ]*\?id=21\  [NC]
RewriteRule /* /peuterspeelzaal? [R=301,L]

RewriteRule ^peuterspeelzaal$ index.php?id=21 [L]
person Gumbo    schedule 13.03.2010
comment
Я не знал о строке запроса, но, похоже, это действительно работает. Просто из любопытства, что именно заставляет этот код работать, а мой нет? - person Robbert van den Bogerd; 22.03.2010
comment
@Robbert van den Bogerd: когда применяется правило, URI изменяется. А флаг L подразумевает перезапуск процесса перезаписи с новым URI. Это вызывает бесконечное перенаправление, поскольку оба правила создают новый URI, который принимается другим правилом. - person Gumbo; 22.03.2010

Я предполагаю, что вы переписываете в обоих направлениях, чтобы старые ссылки перенаправлялись на новые дружественные URL-адреса?

Вы можете просто добавить фиктивный параметр ко всем вашим «дружественным» переписываниям, чтобы они не соответствовали другому правилу:

RewriteCond %{query_string} ^id=21$ [NC]
RewriteRule /* /peuterspeelzaal? [R=301,L]

RewriteRule ^peuterspeelzaal$ index.php?id=21&dummy=1 [L]
person Eric Petroelje    schedule 12.03.2010
comment
Хорошее предложение, однако это больше похоже на взлом, чем на правильное решение. Но эй, это работает! - person Robbert van den Bogerd; 22.03.2010