Взаимодействие апачевского модуля 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