Перенаправление строки запроса с htaccess - PullRequest
3 голосов
/ 09 августа 2011

На веб-сайте, над которым я сейчас работаю, мне нужно настроить перенаправление, учитывающее строку запроса.

Пример:

http://www.domain.com/?id=86&name=John&ref=12d34 -> http://www.domain.com/?ref=12d34
http://www.domain.com/?ref=593x56&id=935 -> http://www.domain.com/?ref=593x56
http://www.domain.com/?ref=3v77l32 -> http://www.domain.com/?ref=3v77l32

Так что в основном мне нужно найти параметр ref и его значение (независимо от его длины) и добавить только эту часть к новому URL. Проблема в том, что параметр ref может отображаться в любом месте URL-адреса.

Буду очень признателен за любую помощь или руководство!

Ответы [ 2 ]

5 голосов
/ 09 августа 2011

RewriteRule не работает со строкой запроса напрямую - для этого нужно использовать RewriteCond.

Вот правило - оно будет перенаправлять (301 постоянное перенаправление) ЛЮБОЙ URL, который имеет большечем 1 параметр в строке запроса и 1 из них ref

RewriteEngine On

RewriteCond %{QUERY_STRING} (^|&)ref=([^&]*)(&|$)
RewriteCond %{QUERY_STRING} !^ref=([^&]*)$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}?ref=%2 [R=301,L]

Например:

  1. Он будет перенаправлять http://www.example.com/hello.php?id=86&name=John&ref=12d34888&me=yes на тот же URL, но сref только параметр: http://www.example.com/hello.php?ref=12d34888.

  2. Это ничего не изменит, если присутствует только параметр ref или его нет вообще, например, http://www.example.com/hello.php?ref=12d34888 или http://www.example.com/hello.php.


Если такое перенаправление должно работать только для корневых хитов сайта, то измените строку RewriteRule на эту:

RewriteRule ^$ http://%{HTTP_HOST}/?ref=%2 [R=301,L]

(если она размещена вФайл .htaccess в корневой папке веб-сайта - если он помещен в конфигурацию сервера / контекст виртуального хоста, правило должно быть слегка изменено).

http://www.example.com/?id=86&name=John&ref=12d34888&me=yes -> http://www.example.com/?ref=12d34888


Если он должен быть перенаправлен на другой домен, замените %{HTTP_HOST} на доменное имя, например:

RewriteRule ^$ http://www.exampe.com/?ref=%2 [R=301,L]

Все это было проверено ранееразмещение.

0 голосов
/ 09 августа 2011
RewriteEngine On
RewriteRule ref=(.*?) /?ref=$1 [L]

примерно такой же простой, как и предполагалось, но он облажается, если переменная ref запроса не является последней вещью в строке - она ​​будет отбрасывать все после ref= и перенаправит ее на, так что

/blah&ref=abc&blahblahblah

превратится в

/ref=abc&blahblahblah
...