Как правильно настроить редирект с www на основной домен в Nginx: полное руководство
Ваш сайт может наказывать сам себя, даже если вы об этом не подозреваете. Представьте: поисковые системы видят два одинаковых сайта — ваш-site.ru и www.ваш-site.ru. Для них это два разных адреса с идентичным контентом. Дубли страниц — это прямой путь к потере позиций в поисковой выдаче и размытию SEO-усилий.
Но эту проблему легко решить одним верным движением. Мы покажем вам, как заставить Nginx автоматически перенаправлять всех посетителей с www-версии на чистый, основной домен. Вы узнаете не только самый простой и надежный способ, но и хитрый обходной путь для тех, кто использует SSL-сертификаты от Let's Encrypt.
Мы разберем два рабочих метода: создание отдельного server-блока и использование условия с регулярным выражением прямо в конфигурации вашего сайта. Вы поймете, как настроить редирект так, чтобы он не мешал критически важным процессам, например, подтверждению домена для обновления SSL.
В статье вас ждут готовые блоки кода, которые можно смело копировать в свою конфигурацию. Мы также проверим, что все работает как часы, с помощью простых команд в терминале. Хватит терять трафик из-за технических мелочей. Переходите к статье и навсегда решите вопрос с дублями вашего сайта!
Из соображений SEO оптимизации у сайта должен быть только один домен. Поддомен с www считается отдельным доменом и если он будет доступен, то это приведет к появлению дублей контента и возможного снижения позиций сайта в выдаче поисковых систем. Поэтому принято делать редирект с домена www на без www.
Изначально подддомен www использовался для того чтобы обозначить, что на сервере развернут веб-сервер и размещён сайт. Сейчас в этом отпала необходимость. В этой статье мы рассмотрим как сделать редирект с www на без www Nginx.
Делаем редирект с www на без www в Nginx
Самый простой способ сделать редирект в Nginx для www домена это создать отдельную секцию server для него и уже оттуда выполнять редирект. Например:
server {
server_name www.losst.pro;
return 301 $scheme://losst.pro$request_uri;
}
Если вы хотите обрабатывать www и не www в одной секции server, можно использовать условие и регулярное выражение. Если в начале переменной хост находятся буквы www, то нужно вернуть код ответа 301 и ссылку на, которую следует перенаправить пользователя:
if ($host ~* ^www.(.*)$) {
return 301 $scheme://$server_name$request_uri;
}
Этот код надо добавить в секцию server сайта, для которого надо настроить редирект. Но если вы используете SSL сертификат LetsEncrypt, то для его генерации нужно подтверждение www домена, так и для не www. Для запроса подтверждения должен возвращаться ответ, а не редирект. Для этого можно создать переменную $need_redirect, а потом менять её значение несколькими условиями:
set $need_redirect "0";
if ($host ~* ^www.(.*)$) {
set $need_redirect "1";
}
if ($request_uri ~* "well-known") {
set $need_redirect "0";
}
if ( $need_redirect ~ "1") {
return 301 https://$server_name$request_uri;
Теперь, если URL содержит слово well-known, которое используется в запросе подтверждения домена для SSL сертификата, то редиректа не будет. Сохраните настройки. Сохраните настройки и перезапустите Nginx:
nginx -s reload
Или:
sudo systemctl restart nginx
После этого можно проверить работает ли редирект с помощью curl:
curl -I www.losst.pro

Код редиректа возвращается, в поле Location есть URL куда надо перенаправить пользователя. Но если попытаться обратиться к URL от LetsEncrypt, то редирекнта не будет:
curl -I https://www.losst.pro/.well-known/acme-challenge/xxxxxxxxxxxxxxxxxxxxxxx

Всё работает как и ожидалось. Если вас интересует как сделать редирект с http на https, то смотрите эту статью. Как видите, всё довольно просто. Если у вас остались вопросы, спрашивайте в комментариях!