Редирект 301: URL с get-параметрами

Редирект через htaccess

Когда дело доходит до редиректа ссылок с get-параметрами, то многие веб-мастера обнаруживают, что стандартные правила в htaccess для них не работают:

Redirect 301 /page.php?id=1 /page/

Еще один не рабочий вариант:

RewriteRule ^page.php?id=1 /page/ [R=301,L]

Правильным решением будет использование директивы RewriteCond:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^id=1$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]

Более подробный вариант:

RewriteEngine On
RewriteCond %{REQUEST_URI} /page.php
RewriteCond %{QUERY_STRING} ^id=1$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]

Если нужно сделать массовый редирект, то воспользуемся регулярным выражением, где (.*) выбирает любое значение:

RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]

Для того, чтобы сделать переадресацию с обычного url на ссылку с get-параметрами, пишем:

RewriteCond %{REQUEST_URI} /page.php$
RewriteRule ^(.*)$ https://mysite.com/newpage?id=1 [R=301,L]

Еще один вариант:

RewriteCond %{QUERY_STRING} ^(?!id)
RewriteRule /page.php$ /newpage?id=1 [L,R=301,QSA]

Редирект средствами php

Бывают ситуации, когда удобнее воспользоваться редиректом на php:

<?php if($_SERVER['REQUEST_URI'] == "/page.php?id=1") {
header("Location: /page/",TRUE,301);
exit();
}
?>

В случае, если нужно сделать переадресацию нескольких url на один адрес, воспользуемся таким кодом:

<?php if (in_array($_SERVER['REQUEST_URI'], array(
'/page.php?id=1',
'/page.php?id=2',

'/page.php?id=100500'
))) {
header("Location: /page/",TRUE,301);
exit();
}
?>

Этим способом можно делать редирект для любых ссылок, кроме кириллических.

Таким же образом можно сделать переадресацию с помощью регулярного выражения:

<?php if(preg_match('/^\/?oldpages\/(.*)$/', $_SERVER["REQUEST_URI"], $match)) {
header("Location: /page/",TRUE,301);
exit();
}
?>

Если нужно исключить любые get-параметры на главной странице:

<?php if($_SERVER['REQUEST_URI'] == '/?'.$_SERVER['QUERY_STRING']) {
header("Location: /",TRUE,301);
exit();
}
?>

Редирект в nginx

Недавно клиенту потребовалось настроить переадресацию c кириллического адреса на обычный с get-параметрами. При этом apache на сервере не использовался. В таком случае нам поможет nginx:

location =/моя-страница {
rewrite ^ /page.php?id=1 permanent;
}

Для переадресации со страницы с get-параметрами используем следующий код:

if ($id = 1) {
rewrite (.*)$ $uri? permanent;
}

После чего нужно перечитать конфигурацию, выполнив service nginx reload или перезапустить nginx - service nginx restart.