2010-03-12 1 views
2

У меня есть сайт cms-driven, без возможности изменить код. То, что я хочу сделать, это создать дружественный URL-адрес, используя только apache mod-rewrite engine.Перенаправление в сочетании с условием перезаписи в htaccess

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

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

Here's код:

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

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

ответ

3

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

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

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

Я не знал о строке запроса, но, похоже, это работает. Просто из любопытства, что именно делает этот код работает, а мой нет? –

+1

@Robbert van den Bogerd: Когда применяется правило, URI изменяется. Флаг * L * подразумевает перезапуск процесса перезаписи с новым URI. Это вызывает бесконечное перенаправление, поскольку оба правила создают новый URI, который принят другим правилом. – Gumbo

3

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

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

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

RewriteRule ^peuterspeelzaal$ index.php?id=21&dummy=1 [L] 
+0

Хорошее предложение, однако это похоже скорее на хак, а на правильное решение. Но эй, это работает! –