Ломаю голову над этим. У меня есть старый 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 — это то, что люди в прошлом добавили в закладки, и я хочу убедиться, что они правильно получат новые данные
решение1
Немного размышлений (и чтения)документация) позже:
Соответствия mod_rewrite используют только часть URL-адреса, содержащую местоположение. "?" обозначает конец местоположения и начало параметров (т. е. QueryString). Когда я это понял, это было простоGoogle далеко.
Итак, для корректного преобразования вам необходимо переписать условие:
RewriteCond %{QUERY_STRING} ^openview&type=Category&key=(.*) [NC]
RewriteRule ^/blog/archive$ /blog/categories/%1.html [NC,R=301,L]
Работает как по волшебству