Почесываю голову на этом. У меня старый URL:
http://myserver/blog/archive?openview&type=Category&key=Demo
и новый URL
http://myserver/blog/categories/Demo
Я пытаюсь получить для этого правило перезаписи. Думал будет:
^/blog/archive\?openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]
Но это ничего не дает. Я попробовал URL и правило (замените? На /):
http://myserver/blog/archive/openview&type=Category&key=Demo
^/blog/archive/openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]
И это работает, как ожидалось. Так что я немного запутался, как обращаться с? для соответствия в старом URL. Все образцы, которые я нашел, описывают противоположный случай. Отправка "красивого" URL-адреса уродливому. В моем случае "уродливый" URL - это то, что люди в прошлом добавляли в закладки, и я хочу убедиться, что они правильно получают новые данные.
Немного подумав (и прочитав документация) потом:
Совпадения mod_rewrite используют только часть адреса URL. Знак "?" отмечает конец местоположения и начало параметров (также известную как QueryString). Как только я это понял, это было просто Google прочь.
Итак, чтобы преобразовать правильно, вам нужно условие перезаписи:
RewriteCond %{QUERY_STRING} ^openview&type=Category&key=(.*) [NC]
RewriteRule ^/blog/archive$ /blog/categories/%1.html [NC,R=301,L]
Работает как шарм