Переадресация с одного домена на другой


 Очень часто сайт первоначально создаётся на каком-нибудь тестовом домене третьего уровня. Затем при подключении основного домена второго уровня возникает проблема, так как обычно поисковые системы успевают проиндексировать сайт, работающий под доменом третьего уровня. Кроме того, существует проблема с доступностью сайта с www и без www, т.е. если сайт доступен сразу по двум адресам, то возникают дубли, приводящие к уменьшению веса сайта. Также есть проблема при доступности сайта под различными доменами, в том числе кириллическими, например, moy-sayt.ru, moysayt.ru, moysayt.su moy-sayt.su, moy-sayt.com, moysayt.com, мойсайт.рф, мой-сайт.рф и т.д. и т.п. Поисковые системы могут запутаться какой из этих адресов является основным, сканировать ли всё сразу или только один. В общем чтоб исправить эту ситуацию, и помочь поисковым системам и обычным пользователям оказываться на правильном домене, необходимо правильно настроить ваш веб сервер. Мы подробно остановимся на двух веб серверах — apache и nginx.

Apache

Для того чтоб происходила переадресация 301 (постоянная) необходимо чтоб  был установлен модуль rewrite и добавлены следующие строчки в файле .htaccess

<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} robots.txt$ [NC]
RewriteRule ^([^/]+) $1 [L]
RewriteCond %{HTTP_HOST} !^www\.moy-domen\.ru
RewriteRule ^(.*)$ http://www.moy-domen.ru/$1 [R=301,L]
</IfModule>

Строки RewriteCond %{REQUEST_FILENAME} robots.txt$ [NC] и RewriteRule ^([^/]+) $1 [L] отключают редирект для robots.txt, делается это исключительно для поисковика Яндекс, соответственно в файле robots.txt добавляется строчка, которая сообщает поисковой системе Яндекс о принадлежности сайта к определённому хосту, вне зависимости от того под каким доменом работает, так как в противном случае будет редирект и Яндекс не сможет получить доступ к robots.txt вторичных доменов вашего сайта:

User-agent: Yandex
Host: www.moy-domen.ru

Строки RewriteCond %{HTTP_HOST} !^www\.moy-domen\.ru и RewriteRule ^(.*)$ http://www.moy-domen.ru/$1 [R=301,L] означают, что если домена не соответствует www.moy-domen.ru, то произвести редирект на домен www.moy-domen.ru.
Так намного правильнее делать, вместо того чтоб перечислять все домены подряд. Соответственно в ServerAlias все домены нужно перечислить. Таким образом если нужно делать редирект на moy-domen.ru, то команда должна выглядеть следующим образом:

RewriteCond %{HTTP_HOST} !^moy-domen\.ru
RewriteRule ^(.*)$ http://moy-domen.ru/$1 [R=301,L]

Nginx

#Чтоб не было редиректа robots.txt
location ^~ /robots.txt {
}

#Если домен не соответствует www.moy-domen.ru, то переадресовать 301 на www.moy-domen.ru
location / {
if ( $host != www.moy-domen.ru ) {
rewrite (.*) http://www.moy-domen.ru$1 permanent;
}
index index.php index.html;
}

Обязательно нужно учесть что между != и www.moy-domen.ru должен быть пробел! Соответственно также добавляем строчку в robots.txt для яндекса (как показано выше), а в server_name перечисляем все наши домены. В отличие от апача, nginx необходимо перегрузить:

#проверка конфигурационного файла nginx
nginx -t
#безопасная перегрузка nginx
nginx -s reload