Настраиваем переадресацию (Redirect 301) для nginx, apache и php

Довольно важный момент при настройке сайта. Неправильно настроенный редирект может сильно повредить поисковой выдачи сайта. Самые распространённые ситуации, в которых приходиться использование Permanent Redirect 301:

  • Смена адреса сайта - вы купили свой домен и решили переехать с site.example.com на site.ru
  • Склейка зеркал - если ваш сайт доступен по адресу www.site.ru и site.ru, поисковые системы могут посчитать это как два разных сайта, поэтому для начала необходимо определиться с главным зеркалом (с www или без www) и настроить редиректы на основное зеркало.
  • Когда страница (одна или несколько) сменила свой адрес - в какой то момент стало понятно, что адреса http://example.com/index.php?option=com_content&task=view&id=23&Itemid=1 не есть хорошо, и нужно их переделать в http://example.com/sport/news12, но жалко терять позиции в индексе поисковых систем (поскольку для них это будет новая статья).
  • Еще один способ для борьбы с дублями страниц
Важно: если страница перемещена временно используйте 302 Moved Temporarily. Склейки страниц в этом случае не произойдет и страницу с редиректом можно будет всегда восстановить.

Permanent Redirect 301 для apache (.htaccess)

Вставлять правила нужно сразу после строк:

RewriteEngine On RewriteBase / # чтобы обрезать полный путь, от корня сервера до корня сайта

сами правила задаются при помощи регулярных выражений, напомним синтаксис:

  • Метасимволы, для задания групп символов или «меток» в шаблоне:
    • ^ — метка начала строки,
    • $ — метка конца строки,
    • ! — отрицание,
    • \ — экранирующий слеш, позволяет считать следующий за ним метасимвол обычным символом,
    • . — точка, обозначает любой символ, но только один,
    • () — группировка.
  • Модификаторы, ставятся после обычных символов, метасимволов или их групп:
    • ? — символ повторяется 0 или 1 раз,
    • * — повторяется от 0 до 65536 раз,
    • + — повторяется от 1 до 65536 раз.
  • Флаги, определяют дополнительные опции для данного правила:
    • NC — (nocase) отключает проверку регистра символов.
    • R — (redirect) останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (302, MOVED TEMPORARY).
      С данным флагом можно указать другой код результата, например R=301 возвратит редирект с кодом 301 (MOVED PERMANENTLY). Как вы понимаете, это то самое, что нам и надо.
    • L — (last) останавливает процесс преобразования, и текущая ссылка считается окончательной.

Рассмотри наиболее часто встречаемые ситуации:

Редирект с www.site.ru на site.ru

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Редирект для с site.ru на www.site.ru

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteCond обозначаем условие, при совпадении с которым будет выполнено правило RewriteRule.

Редирект с index.php (html) на главную страницу

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/ 
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L]

Смотрите также более подробно статью: Как сделать редирект на php.

Редирект при смене структуры сайта

RewriteRule ^post/category/(.*)$ blog/category/$1 [R=301,L]
RewriteRule ^post/(.*)$ blog/post/$1 [R=301,L]

Permanent Redirect 301 на PHP

Чтобы сообщить браузеру о том, что с запрошенной им страницы нужно произвести редирект на адрес http://site.ru выполните команды:

header("HTTP/1.1 301 Moved Permanently");
header("Location: http://site.ru");
exit();

Permanent Redirect 301 для nginx

Правила редиректа описывается в секции server.

Редирект с www.site.ru на site.ru

server {
	listen 80;
	server_name www.site.ru;
	rewrite ^ http://site.ru$request_uri? permanent;
}

или общее правило для всех сайтов:

server {
  server_name ~^(?! www\.);
  rewrite ^ http://www.$host$request_uri permanent;
}

Редирект для с site.ru на www.site.ru

server {
	listen 80;
	server_name site.ru;
	rewrite ^ http://www.site.ru$request_uri? permanent;
}

Редирект с index.php на главную страницу

location = /index.php {
	if ($request_uri = /index.php) {
		rewrite ^ http://$host? permanent;#301 redirect
	}
	fastcgi_pass   unix:/tmp/fastcgi.sock;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
	include        fastcgi_params;
}

Добавить комментарий


Защитный код
Обновить