Настраиваем переадресацию (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;
}