Недавно столкнулся с интересной штукой. Оказывается, те домены, которые мы используем для своих сайтов, не являются полноценными. То есть, они, конечно, работают стопроцентно полно и правильно, только по стандарту W3C в конце названия домена должна стоять точка! Да-да, вот такая вот: «.». В итоге полные имена доменов должны на самом деле выглядеть вот так: google.com. , yandex.ru.
Самое интересное, что если эту точку умышленно поставить, то сервера будут находиться и сайты будут открываться! Можно было бы спокойно проигнорировать эту проблему, если не одно «но». Дело в том, что при кажущейся нормальности имена доменов с точкой всё же отличаются от оригинальных имён доменов и это приводит к тому, что куки теряются (зарегистрированный и залогиненый пользователь, войдя на домен с точкой в конце обнаружит, что он не залогинен). Если стоит сертификат SSL, привязанный к имени домена без точки, то он будет кричать о невалидности ресурса (попробуйте, например, зайти на сайт https://www.google.ru./ ). Кроме того, возникает вопрос с SEO — а не будет ли сайт «с точкой» воспринят поисковиками как зеркало основного? Если да, то это однозначно потянет за собой понижение рейтинга!
Самое смешное, что если в вашем движке сайта все абсолютные ссылки автоматически привязываются к имени домена, полученному из $_SERVER[‘HTTP_HOST’], то все страницы сайта окажутся расположенными на «зеркальном» домене!
Поэтому очевидно, что проблему домена с «точкой на конце» нужно как-то решать.
Первое, что приходит в голову — принять за базовое имя домена имя без точки и добавить в htaccess и конфиг nginx (в зависимости от того, что у вас стоит на хостинге) правило, которое будет автоматически редиректить неправильный домен на правильный.
Не буду вас мучать и сразу скажу, что в процессе проб и ошибок удалось обнаружить следующее работающее решение для nginx:
if ($http_host != 'hostname.com') { return 301 http://hostname.com$request_uri; }
Данный блок следует разместить в теле директивы server{}, которая описывает ваш сервер. Разумеется, если вы используете базовое имя домена с «www» в начале, то вместо «hostname.com» следует указывать www.hostname.com в обоих местах.
Решение для Apache выглядит следующим образом:
RewriteCond %{HTTP_HOST} !^domain\.zone$ RewriteRule ^(.*)$ http://domain.zone/$1 [L,R=301]
Кстати, напомню тем, кто до сих пор не знает, что у любого сайта по умолчанию может быть два имени — www.hostname.com и hostname.com. Сайт может нормально открываться по обоим адресам. Но технически это разные домены, поэтому для хорошего SEO необходимо обеспечить уникальное имя домена (чтобы не возникло «дубликата» сайта).
Так вот, наиболее правильным решением будет обеспечение редиректа с неправильного адреса на правильный. При этом в конфигурации сервера придётся вводить запись для каждого домена (так как повторяю — технически это разные домены).
У себя в nginx я делаю следующим образом (как видите, строки из статьи выше уже добавлены):
# For "mirror" domain server { listen 80; server_name www.mydomain.ru; if ($http_host != 'mydomain.ru') { return 301 http://mydomain.ru$request_uri; } rewrite ^ http://mydomain.ru$request_uri? permanent; #301 redirect } # For main domain server { listen 80; server_name mydomain.ru; if ($http_host != 'mydomain.ru') { return 301 http://mydomain.ru$request_uri; } # Другие директивы конфигурации основного сервера # ..... }
Разумеется, если вы выбрали в качестве основного домена имя с префиксом «www», то надо соответственно заменить все имена доменов «наоборот».
На сегодня это всё. Программируйте правильно!