Apache RewriteRule и строка запроса

Взаимодействие апачевского модуля mod_rewrite со строкой запроса на первый взгляд выглядит запутанным. Вот что написано в официальной документации RewriteRule:

‘qsappend|QSA’ (query string append)
This flag forces the rewrite engine to append a query string part of the substitution string to the existing string, instead of replacing it. Use this when you want to add more data to the query string via a rewrite rule.

По-русски, флаг QSA принуждает rewrite-модуль не заменять строку запроса в результирующем URL, а дополнять ее полученными новыми значениями. Теперь к следующему варианту использования строк запроса.

Давайте попробуем перенаправить страницу в зависимости от содержимого строки запроса. Наше правило должно выглядеть так:

RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^page\.php$ http://mydomain.site/page/%1.php [R=302,L]

Вполне естественно, мы ожидаем следующее:

/page.php?id=37 -> http://mydomain.site/page/37.php
/page.php?id=40 -> http://mydomain.site/page/40.php

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

/page.php?id=37 -> http://mydomain.site/page/37.php?id=37
/page.php?id=40 -> http://mydomain.site/page/40.php?id=40

Если нужно убрать исходную строку запроса, нужно в конце правила RewriteRule дописать символ вопросительный знак. Можно назвать этот символ флагом сброса строки запроса (ух какое название!), либо QSNA – query string not append.

RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^page\.php$ http://mydomain.site/page/%1.php? [R=302,L]

Ниже краткий справочник по работе со строками запроса в правилах RewriteRule:

Сохранить исходный запрос (поведение по умолчанию)
RewriteRule ^page\.php$ /target.php [L]
# до:    http://example.com/page.php?foo=bar
# после: http://example.com/target.php?foo=bar

Удалить исходный запрос
RewriteRule ^page\.php$ /target.php? [L]
# до:    http://example.com/page.php?foo=bar
# после: http://example.com/target.php

Заменить исходный запрос
RewriteRule ^page\.php$ /target.php?bar=baz [L]
# до:    http://example.com/page.php?foo=bar
# после: http://example.com/target.php?bar=baz

Дополнить новый запрос к исходному запросу
RewriteRule ^page\.php$ /target.php?bar=baz [QSA,L]
# до:    http://example.com/page.php?foo=bar
# после: http://example.com/target.php?foo=bar&bar=baz

Похожие статьи

Leave a Reply

Your email address will not be published. Required fields are marked *