Редирект через 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
.