Введение
В этом руководстве мы объясним, как перенаправить HTTP-трафик через HTTPS в Nginx.
Nginx (произносится как «engine x») — это бесплатный высокопроизводительный HTTP- и обратный прокси-сервер с открытым исходным кодом, отвечающий за управление нагрузкой некоторых крупнейших сайтов в Интернете.
Если вы разработчик или системный администратор, скорее всего, вы регулярно имеете дело с Nginx. Одной из наиболее распространенных задач, которые вы, вероятно, будете выполнять, является перенаправление HTTP-трафика на безопасную (HTTPS) версию вашего веб-сайта.
В отличие от HTTP, где запросы и ответы отправляются и возвращаются в виде обычного текста, HTTPS использует TLS/SSL для шифрования связи между клиентом и сервером.
Преимущества использования HTTPS вместо HTTP многочисленны:
- Все данные шифруются в обоих направлениях. В результате конфиденциальная информация не может быть прочитана в случае перехвата.
- Google Chrome и все другие популярные браузеры пометят ваш сайт как безопасный.
- HTTPS позволяет использовать протокол HTTP/2, что значительно повышает производительность сайта.
- Google предпочитает веб-сайты HTTPS. Ваш сайт будет лучше ранжироваться, если будет предлагаться через HTTPS.
Предпочтительный метод перенаправления HTTP на HTTPS в Nginx — настроить отдельный блок сервера для каждой версии сайта. Вам следует избегать перенаправления трафика с помощью директивы if, так как это может привести к непредсказуемому поведению сервера.
Перенаправление HTTP на HTTPS для каждого сайта
Обычно, когда сертификат SSL установлен в домене, у вас будет два блока сервера для этого домена. Первый для HTTP-версии сайта на порту 80, а другой для HTTPS-версии на порту 443.
Чтобы перенаправить один веб-сайт через HTTPS, откройте файл конфигурации домена и внесите следующие изменения:
server {
listen 80;
server_name noviello.it www.noviello.it;
return 301 https://noviello.it$request_uri;
}
Разберем код построчно:
listen 80
— блок сервера будет прослушивать входящие соединения через порт 80 для указанного домена.server_name noviello.it www.noviello.it
— указывает доменные имена блока серверов. Убедитесь, что вы заменили его своим собственным доменным именем.return 301 https://noviello.it$request_uri
— Перенаправить трафик на HTTPS-версию сайта. Переменная$request_uri
— это полный исходный URI запроса, включая аргументы.
Обычно вы также захотите перенаправить версию HTTPS-сайта с www на версию без www или наоборот. Рекомендуемый способ перенаправления — создать отдельный серверный блок для версий с www и без www.
Например, чтобы перенаправить HTTPS-запросы с www на не-www, используйте следующую конфигурацию:
server {
listen 80;
server_name noviello.it www.noviello.it;
return 301 https://noviello.com$request_uri;
}
server {
listen 443 ssl http2;
server_name www.noviello.it;
#... other code
return 301 https://noviello.it$request_uri;
}
server {
listen 443 ssl http2;
server_name noviello.it;
#... other code
}
Всякий раз, когда вы вносите изменения в файлы конфигурации, вам необходимо перезапустить или перезагрузить службу Nginx, чтобы изменения вступили в силу:
sudo systemctl reload nginx
Перенаправить все сайты на HTTPS
Если все веб-сайты, размещенные на сервере, настроены на использование HTTPS, и вы не хотите создавать отдельный блок HTTP-сервера для каждого сайта, вы можете создать универсальный блок HTTP-сервера. Этот блок будет перенаправлять все HTTP-запросы в соответствующие блоки HTTPS.
Чтобы создать единый универсальный HTTP-блок, который будет перенаправлять посетителей на HTTPS-версию сайта, откройте файл конфигурации Nginx и внесите следующие изменения:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Разберем код построчно:
listen 80 default_server
— Устанавливает этот серверный блок в качестве строительного блока (всеобъемлющего) для всех несовпадающих доменов.server_name _
-_
является недопустимым доменным именем, которое никогда не совпадает ни с одним реальным доменным именем.return 301 https://$host$request_uri
— Перенаправить трафик на соответствующий блок сервера HTTPS с кодом состояния 301 (перемещено навсегда). Переменная$host
содержит доменное имя запроса.
Например, если посетитель открывает в браузере http://example.com/page2
, Nginx перенаправит запрос на https://example.com/page2
.
Если возможно, предпочтите создать перенаправление для каждого домена, а не глобальное перенаправление с HTTP на HTTPS.
Вывод
В Nginx предпочтительным способом перенаправления HTTP на HTTPS является создание отдельного блока сервера и выполнение перенаправления 301.