Как настроить nginx на https и перенаправление с-www на без-www

#nginx, #хостинг, #seo
Как настроить nginx на https и перенаправление с-www на без-www

Как правильно настроить nginx для 301 редиректов основных зеркал сайта для корректного SEO продвижения? Давайте разберемся. Для начала правильно сформулируем задачу. Любой сайт, как правило, может быть доступен по 4-ым основным зеркалам. Откуда 4ре и как их быстро запомнить для тестирования в любое для и ночи при настройке перенаправлений? Делюсь своими правилами.

4 варианта зеркал сайта

  1. любой сайт может быть доступен по двум протоколам: HTTP и HTTPS - это 2 варианта
  2. т.к. на заре зарождения интернета была традиция начинать проговаривать названия сайта с трех W - то логично любой домен делать доступным и с поддоменом www - это еще 2 варианта

Итого получаем 2 * 2 = 4 варианта обращения к главной странице сайта в адресной строке браузера. Рассмотрим на примере домена tale.by:

  1. http://tale.by
  2. https://tale.by
  3. http://www.tale.by
  4. https://www.tale.by

Это и есть основные 4 зеркала сайта, о которых идет речь в данной статье. Главный на палубе определяет, какой вараинт домена является основные, а дальше технический специалист со всех остальных 3-х вариантов настраивает 301 редирект на главное зеркало. В случае нашего сайта - это www.tale.by. Почему капитан сказал оставить www ? Потому что домен короткий и на визитках с www лучше смотрится. Обычно домены не бывают такими короткими, и основным зеркалом делают вариант без поддомена - так мы сделали на сайте arista.by.

Настройка выделенного сервера для редиректов

В этой статье рассмотрена самая популярная конфигурация VPS на момент написания:

  • операционная система - Ubuntu 18.04
  • веб-сервер - nginx
  • бесплатные SSL сертификаты - Let's Encrypt
  • утилита для генерации сертификатов - certbot

Для чего нужен SSL-сертификат

SSL-сертификат нужен для корректной работы сайта по протоколу HTTPS. Зачем вообще сайту работать по протоколу HTTPS? И чем он отличается от старого-доброго HTTP?

Что такое протокол HTTPS

S на конце - это сокращение от английского слова Secure - что в переводе означает безопасность. Когда мы хотим открыть в браузере сайт - наш просмоторщик устанавливает соединение с компьютером, на котором хранятся файлы этого сайта. Наш компьютер называется клиентом, а компьютер сайта - сервером. В процессе клиент-серверного взаимодействия между ними передаются байты информации, а чтобы и клиенту, и серверу было понятно, как трактовать переданную/принятую информацию - нужен алгоритм общения между ними. Этот алгоритм общения регулируется опредленным сводом правил - протоколом. HTTP - это название для протокола общения клиента и сервера. Secure HTTP - HTTPS - это вариант общения, когда передаваемые данные шифруются.

Зачем сайту передаваться между комьютерами в зашифронованном виде?

Объективно это надо только тогда, когда передается важная информация, к примеру, данные о платженой карте.

Несколько лет назад браузеры не проявляли визуальной враждебности к сайтам, работающим по протокалу HTTP. Но теперь в адресной строке такие сайты подсвечиваются как небезопасные. Поэтому любой маркетолог и SEO-шник вам скажет: не отпугивайте посетителей, используйте безопасный протокол передачи данных - HTTPS. Согласитесь, одной этой причины уже достаточно, чтобы не рассматривать работу по нешифрованному протоколу HTTP.

Как подсвечивается в браузере небезопасный сайт

Связь HTPS и SSL-сертификата

Не вникая в глубины теории, чтобы шифрование по протоколу HTTPS работало нужны два файла: секретный ключ и публичный ключ. Очень грубо говоря SSL-сертификат из них и состоит. Кашэрный сертификат должен быть удостоверен авторитетным центром. Если попытаться открыть сайт по протоколу HTTPS,  а на сервере сайта не будет находиться привязанного к сайту, действительного сертификата, то вместо содержимого сайта ваш браузер выдаст враждебно раскрашенное предупреждение о попытке установления небезопасного соединения:

Сообщение о небезопасном подключении

Бесплатный SSL-сертификат

Из вышесказанного должно быть понятно, что для корректной работы сайта по протоколу HTTPS нужно достать дейтсвительный SSL-сертификат. Обычно их предлагают за маленькие и не маленькие деньги хостер-провайдеры. На определенных не базовых тарифах хостинга в качестве бонуса могут давать сертификаты бесплатно. Какой выбрать? Все зависит от специфики конкретного сайта. Если вы через свой сайт не передаете важные конфиденциальные данные - используйте бесплатный. Иначе - тот, на который денег не жалко.

На собственном VPS сгенерировать бесплтаный Let’s Encrypt SSL-сертификат можно при помощи утилиты certbot - она в считанные секунды сгенерирует сертификаты и настроит nginx для работы с ними. 

Рассмотрми на примере сайта madewithfire.com. Я хочу, чтобы certbot сам добавил в конфиг вирутального хоста nginx пути к сгенерированным ключам сертификата и настроил 301-редиректы. Что для этого надо?

Запуск certbot для nginx

Запускаем команду в терминале виртуального сервера: certbot --nginx -d madewithfire.com -d www.madewithfire.com

Когда команда задаст вопрос: Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access - выбираем: 

2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.

Далее открываем сайт с конфигом и проверяем редиректы.

Перенаправление https://www на просто https:// без www

Для этого должна быть прописана конфиграция сервера, которая:

  • обрабатывает домен с поддоменом www: server_name  www.madewithfire.com;
  • слушает порт 443 (listen 443 ssl), указывая по какому пути лежат ключи для шифрования
  • делает 301 редирект на главное зеркало: return 301 https://madewithfire.com$request_uri;

Код для такой конфигурации приведен ниже:

server {
    server_name  www.madewithfire.com;
    return       301 https://madewithfire.com$request_uri;


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/madewithfire.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/madewithfire.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

Настройка server для основного зеркала

Эта настройка должа включать следующее:

  • что она для версии сайта без www: server_name madewithfire.com;
  • что прослушивается 443 порт и указаны пути для ключей

Отрывки этой конфигурации приведены ниже:

 

server {
	server_name madewithfire.com;
...	

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/madewithfire.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/madewithfire.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

Перенаправление не-www версии сайта с http на https

Должно быть:

  • слушается порт 80: listen 80;
  • server_name madewithfire.com;
  • происходит 301 редирект на https://

Конфигурация приведена ниже. Она делает редирект с http://madewithfire.com на https://madewithfire.com

server {
    if ($host = madewithfire.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


	server_name madewithfire.com;
    listen 80;
    return 404; # managed by Certbot


}

Перенаправление с http://www на https://www

Для этого нужно:

  • прослушивать 80-ый порт: listen 80;
  • версией с поддоменом www: server_name  www.madewithfire.com;
  • возвращать 301 редирект: return 301 https://$host$request_uri;

Пример конфига от certbot для этого случая приведен ниже:

server {
    if ($host = www.madewithfire.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name  www.madewithfire.com;
    listen 80;
    return 404; # managed by Certbot
}

Проверка на внимательность

Внимательный читатель может заметить:

  1. в последнем конфиге перенаправление на главное зеркало идет не сразу. Конфиг направит непосредственно на версию https://www - а она уже перенаправит на https:// без www
  2. в конфигах от certbot есть много лишнего. К примеру, в п1 выше можно было сразу перенаправить на главное зеркало. Но надо понять, что certbot старается сгенерировать универсальную конфигурацию - а универсальная не равна оптимальной
  3. проверка на if ($host = ... вообще не обязательна, потому что в этих примерах в server_name указывается только один домен
  4. по умолчанию http запросы обрабатываются 80-ым портом, а https - 443
  5. если конфиг настроен на прослушку 443 порта, надо указывать, где лежат ключи для действительного сертификата

Поделиться в соцсетях: