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

301 redirect

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




Комментарии

Напишите в мессенджерах

Пожалуйста, прочтите перед этим FAQ