Назад | Перейти на главную страницу

Правило перезаписи, когда источник содержит '?'

Почесываю голову на этом. У меня старый 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]

Работает как шарм