Это на вопрос уже есть ответ здесь:
Почесал голову на этом. У меня есть старый 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]
Работает как шарм