Редирект через .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:
if($_SERVER['REQUEST_URI'] == '/page.php?id=1') {
header('Location: /page/', true, 301);
exit();
}
В случае, если нужно сделать переадресацию нескольких url на один адрес, то воспользуемся таким кодом:
if(in_array($_SERVER['REQUEST_URI'],
[
'/page.php?id=1',
'/page.php?id=2',
'…',
'/page.php?id=100500'
])
) {
header('Location: /page/', true, 301);
exit();
}
Этим способом можно делать редирект для любых ссылок, кроме кириллических.
Таким же образом можно сделать переадресацию с помощью регулярного выражения:
if(preg_match('/^\/?oldpages\/(.*)$/', $_SERVER['REQUEST_URI'], $match)) {
header('Location: /page/', true, 301);
exit();
}
Если нужно исключить любые get-параметры на главной странице:
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;
}
После чего нужно перечитать конфигурацию, выполнив systemctl reload nginx
или перезапустить NGINX - systemctl restart nginx
.