Как я могу отключить QSA?(строка запроса добавляется) - PullRequest
4 голосов
/ 21 октября 2010

Я использую Apache2 и mod_rewrite, чтобы скрыть мои строки запроса. Вот эти правила.

RewriteCond %{QUERY_STRING}                 ^query=(.*)$
RewriteRule (.*)                            /search/%1             [R=301,L]

RewriteRule ^search\/?$                     /search/?query=test    [R=301,L]

Когда я посещаю /search (или /search/), меня правильно перенаправляют на /search/?query=test (согласно последнему правилу)

Оттуда RewriteCond и RewriteRule должны включиться и перенаправить меня на /search/test, верно? Из того, что я понимаю, %1 в моем первом RewriteRule соответствует (.*) в RewriteCond, который должен содержать test.

Однако на самом деле меня перенаправляют на /search/test/?query=test. Итак, правило работает, но по какой-то причине строка запроса добавлена. Это опция QSA, автоматически или как-то добавляемая?

Затем я застрял в бесконечном цикле перенаправления на /search/test?query=test, потому что первые RewriteCond и RewriteRule включаются снова, и снова, и снова ...

Что я делаю не так?!

Спасибо!

1 Ответ

11 голосов
/ 22 октября 2010

Вам необходимо указать пустой запрос в подстановке , чтобы предотвратить добавление исходного запрошенного запроса к новому URL:

Изменение строки запроса

По умолчанию строка запроса пропускается без изменений.Однако вы можете создавать URL-адреса в строке подстановки, содержащей часть строки запроса.Просто используйте знак вопроса внутри строки замещения, чтобы указать, что следующий текст должен быть повторно введен в строку запроса.Если вы хотите стереть существующую строку запроса, завершите строку подстановки только знаком вопроса.Чтобы объединить новые и старые строки запроса, используйте флаг [QSA].

Итак:

RewriteCond %{QUERY_STRING} ^query=(.*)$
RewriteRule (.*) /search/%1? [R=301,L]
...