Сбой Apache Redirect 301 при использовании параметров GET, таких как? Blah = - PullRequest
18 голосов
/ 11 августа 2009

Я создал новый PHP-сайт для клиента и хочу перенаправить лучшие результаты Google из старой структуры сайта в новую.

Я поместил несколько десятков Redirect 301 в .htaccess в documentroot, и хотя некоторые из них работают нормально, у меня проблемы с кучей других.

Это прекрасно работает:

Redirect 301 /nl/flash/banner_new.swf http://www.example.com/actueel/nieuws.html?action=show&f_id=152

Это не работает! (приводит к 404, так как перенаправление просто пропущено):

Redirect 301 /nl/index.php?mID=24511&subID=0 http://www.example.com/solutions/printsolutions.html
Redirect 301 /nl/index.php?mID=24512&subID=0 http://www.example.com/support/koppeling-met-omgeving.html

Переадресация смешивается в файле .htaccess, и только перенаправления с параметрами GET кажутся ошибочными.

Есть ли обходной путь? Игнорирование неудачных перенаправлений не вариант для клиента. Спасибо за ваши мысли.

Ответы [ 3 ]

16 голосов
/ 12 августа 2009

Хотя аргументация ответа Гамбо была верной, я не мог заставить его RewriteRule работать.

Добавление еще одного RewriteCond сделало это. Следующее было проверено и работает нормально.

RewriteCond %{REQUEST_URI} /nl/index.php$
RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$
RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html [L,R=301]
12 голосов
/ 06 ноября 2009

Согласен с ответами Гамбо и Мартина ... но:

Опечатка в Martijn's, должен быть "^", чтобы начать регулярное выражение для условия REQUEST_URI:

RewriteCond %{REQUEST_URI} ^/nl/index.php$

Я тоже мог заставить работать только Мартина, а не Гамбо, где был мой файл .htaccess.

Кроме того, если вы не хотите, чтобы строка параметра передавалась при перезаписи, вы должны добавить «?» в конце URL:

RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html? [L,R=301]

В противном случае, следуя коду Martijn, он читает «если ваш URL /nl/index.php?mID=24511&subID=0, то перенаправьте на http://www.example.com/solutions/printsolutions.html?mID=24511&subID=0 с заголовком 301 Permanent redirect и не обрабатывайте больше правил по этому URL "

Это может быть, а может и не быть тем, что вы хотите, и быть справедливым, как общее правило, если параметры не поняты, они будут просто игнорироваться, не причиняя никакого вреда, поэтому, вероятно, это не будет иметь значения. Однако, если вы хотите перенаправить человека на новую страницу и хотите получить «красивые URL-адреса», тогда удаление строки параметра предпочтительнее, поэтому вставьте «?» в конце целевого URL.

12 голосов
/ 11 августа 2009

Redirect работает только с путями URL:

Старый URL-путь - это регистрозависимый (% -декодированный) путь, начинающийся с косой черты. [...]

Таким образом, запрос URL (часть после первого ? до первого # после) не проверяется.

Но вы можете использовать mod_rewrite , чтобы сделать это:

RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$
RewriteRule ^nl/index\.php$ http://www.example.com/solutions/printsolutions.html [L,R=301]
RewriteCond %{QUERY_STRING} ^mID=24512&subID=0$
RewriteRule ^nl/index\.php$ http://www.example.com/support/koppeling-met-omgeving.html [L,R=301]
...