Принудительный редирект с HTTP на HTTPS в Nginx
Принудительный редирект с HTTP на HTTPS в Nginx: Защищаем трафик и SEO
Вы когда-нибудь заходили на сайт и видели в адресной строке браузера зеленый замочек? Это значит, что соединение защищено протоколом HTTPS — данные между вами и сервером шифруются, и их нельзя перехватить. Но что, если пользователь случайно введет адрес с HTTP (без шифрования)? Ваш сайт должен автоматически перенаправить его на безопасную версию.
Почему это критично?
- Безопасность: Злоумышленники могут перехватить данные (пароли, платежи) на HTTP.
- SEO: Google понижает в выдаче сайты без HTTPS.
- Доверие: Пользователи видят предупреждение "Не защищено" и уходят.
В этом уроке вы научитесь настраивать принудительный редирект с HTTP на HTTPS в Nginx — самом популярном веб-сервере для высоконагруженных проектов. Мы разберем 3 метода (от простого к продвинутому), нюансы с поддоменами и WWW, а также избежим типичных ошибок.
1. Подготовка: Что нужно знать перед настройкой
Прежде чем приступать, убедитесь, что:
✅ У вас установлен Nginx (версия 1.4+).
✅ На сервере настроен SSL-сертификат (например, от Let’s Encrypt).
✅ Вы имеете доступ к конфигурационным файлам Nginx (обычно /etc/nginx/).
Важно! Если SSL-сертификата нет, сначала получите его. Для тестов можно использовать самоподписанный сертификат, но в продакшене — только доверенные (Let’s Encrypt, Cloudflare, Sectigo).
2. Метод 1: Простой редирект для одного домена
Самый базовый способ — перенаправить все запросы с HTTP на HTTPS для одного домена (например, example.com).
Шаг 1. Открываем конфиг Nginx
Конфигурационные файлы Nginx обычно лежат в /etc/nginx/sites-available/. Найдите файл вашего сайта (например, example.com.conf) и откройте его в редакторе:
sudo nano /etc/nginx/sites-available/example.com.conf
Шаг 2. Настраиваем редирект
Добавьте новый серверный блок для обработки HTTP-запросов (порт 80) и перенаправления их на HTTPS (порт 443):
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
Разбор кода:
listen 80— слушаем HTTP-порт.server_name— указываем домены, для которых действует правило.return 301— постоянный редирект (301) на HTTPS-версию.$request_uri— сохраняем оригинальный путь (например,/blog/post→https://example.com/blog/post).
Шаг 3. Проверяем и перезагружаем Nginx
Перед применением проверьте конфиг на ошибки:
sudo nginx -t
Если тест прошел успешно, перезагрузите Nginx:
sudo systemctl reload nginx
Шаг 4. Тестируем
Откройте браузер и введите:
http://example.com
Вы должны автоматически перейти на:
https://example.com
Почему 301, а не 302?
- 301 (Moved Permanently) — постоянный редирект. Поисковые роботы обновят индекс на HTTPS.
- 302 (Found) — временный. Не рекомендуется для SEO.
3. Метод 2: Редирект с WWW на не-WWW (или наоборот)
Часто нужно не только перевести на HTTPS, но и нормализовать домен (например, перенаправить www.example.com → example.com). Это важно для SEO, чтобы избежать дублирования контента.
Вариант А: С WWW на не-WWW + HTTPS
server {
listen 80;
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /путь/к/сертификату.crt;
ssl_certificate_key /путь/к/ключу.key;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /путь/к/сертификату.crt;
ssl_certificate_key /путь/к/ключу.key;
# Здесь ваша основная конфигурация для HTTPS
root /var/www/example.com;
index index.html;
# ...
}
Логика:
- Все HTTP-запросы (порт 80) → редирект на HTTPS + не-WWW.
- HTTPS-запросы на
www.example.com→ редирект наexample.com. - Основной блок обрабатывает только
https://example.com.
Вариант Б: С не-WWW на WWW + HTTPS
Если вам нужна версия с www, поменяйте местами домены в return 301.
4. Метод 3: Универсальный редирект для всех доменов (массовая настройка)
Если у вас много сайтов на одном сервере, можно автоматизировать редирект для всех доменов, не прописывая каждый вручную.
Шаг 1. Создаем отдельный конфиг для редиректов
Создайте файл /etc/nginx/conf.d/redirect-http-to-https.conf:
sudo nano /etc/nginx/conf.d/redirect-http-to-https.conf
Добавьте туда:
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Пояснения:
default_server— этот блок будет обрабатывать все запросы на порт 80, для которых нет отдельногоserver_name.server_name _— подстановочный символ для любых доменов.$host— автоматически подставляет оригинальный домен (например,example.comилиsub.example.com).
Шаг 2. Проверяем и применяем
sudo nginx -t && sudo systemctl reload nginx
Предупреждение! Этот метод не подходит, если у вас есть сайты, которые должны работать только по HTTP (например, внутренние сервисы). Для них нужно создать отдельные конфиги с
listen 80доdefault_server.
5. Типичные ошибки и как их избежать
| Ошибка | Причина | Решение |
|---|---|---|
| Редирект зацикливается | В HTTPS-блоке тоже прописан редирект на HTTPS | Убедитесь, что в блоке с listen 443 нет return 301 |
| Сайт не открывается после редиректа | Неверный путь к SSL-сертификату | Проверьте пути в ssl_certificate и ssl_certificate_key |
Редирект работает, но теряется путь (например, /blog → /) |
Не указан $request_uri |
Добавьте $request_uri в return 301 |
| Nginx не перезагружается | Синтаксическая ошибка в конфиге | Запустите sudo nginx -t для диагностики |
| Редирект не работает для поддоменов | В server_name не указаны поддомены |
Добавьте *.example.com или перечислите явно |
6. Продвинутые нюансы
А. Редирект с сохранением языка (для многоязычных сайтов)
Если у вас URL вида example.com/en/page, используйте:
return 301 https://example.com$request_uri;
Это сохранит /en/page после редиректа.
Б. Редирект с исключениями
Допустим, вам нужно не перенаправлять некоторые пути (например, /healthcheck для мониторинга):
server {
listen 80;
server_name example.com;
location /healthcheck {
return 200 "OK";
}
location / {
return 301 https://example.com$request_uri;
}
}
В. Редирект с HSTS (дополнительная защита)
HSTS (HTTP Strict Transport Security) — это заголовок, который принудительно заставляет браузер всегда использовать HTTPS в течение заданного времени.
Добавьте в HTTPS-блок:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Что это дает?
- Браузер запомнит, что сайт должен открываться только по HTTPS.
- Даже если пользователь введет
http://, браузер автоматически подставитhttps://. preloadпозволяет добавить домен в список предзагрузки HSTS (используется Google Chrome и другими браузерами).
Внимание! Включайте HSTS только после тестирования HTTPS! Если сертификат истечет или будет ошибка, пользователи не смогут зайти на сайт.
7. Проверка результата
После настройки проверьте:
- Ручной тест:
- Откройте
http://example.com→ должен перейти наhttps://example.com. - Проверьте с
wwwи без.
- Откройте
- Инструменты для вебмастеров:
- Команда
curl:curl -I http://example.comДолжен вернуть статус 301 и заголовок
Location: https://example.com.
Практика для закрепления
Упражнение 1. Базовый редирект
Настройте редирект с HTTP на HTTPS для домена test-site.ru. Конфигурационный файл лежит в /etc/nginx/sites-available/test-site.ru.conf.
Шаги:
- Откройте файл.
- Добавьте серверный блок для порта 80 с редиректом на HTTPS.
- Проверьте конфиг и перезагрузите Nginx.
- Протестируйте в браузере.
Упражнение 2. Редирект с WWW
Модифицируйте конфиг из Упражнения 1, чтобы:
- Все запросы на
www.test-site.ruперенаправлялись наhttps://test-site.ru. - Основной сайт работал только на
https://test-site.ru(безwww).
Упражнение 3. Массовый редирект
На сервере хостятся 5 сайтов:
site1.comsite2.comblog.site1.comshop.site2.comold-project.com(должен остаться на HTTP)
Настройте один конфиг, который будет перенаправлять все сайты на HTTPS, кроме old-project.com.
Упражнение 4. Диагностика ошибок
Пользователь жалуется, что после настройки редиректа сайт example.org не открывается. При вводе http://example.org браузер показывает ошибку ERR_TOO_MANY_REDIRECTS.
Вопросы:
- В чем возможная причина?
- Как это исправить?
Упражнение 5. HSTS
Добавьте заголовок HSTS для домена secure-site.com с параметрами:
max-age=63072000(2 года)- Включите поддомены (
includeSubDomains) - Разрешите предзагрузку (
preload)
Итоги
Вы научились: ✅ Настраивать принудительный редирект с HTTP на HTTPS в Nginx. ✅ Работать с WWW и не-WWW версиями домена. ✅ Автоматизировать редиректы для многих сайтов. ✅ Избегать типичных ошибок и тестировать результат. ✅ Усиливать безопасность с HSTS.
Следующий шаг:
- Настройте автоматическое обновление SSL-сертификатов (например, через
certbotдля Let’s Encrypt). - Изучите оптимизацию Nginx для высоких нагрузок (keepalive, gzip, caching).
Если остались вопросы — задавайте в комментариях! 🚀
Генератор паролей с длинной 64 символа
Женская одежда с бахромой
Кадастровые работы в Бийске
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать планировку сайта для блогов на DreamHost
Как выбрать Vdsina вечный хостинг для своего проекта
Казань окна VEKA - профессионализм и опыт
Курьерская вода
Новостройки Оренбурга: недвижимость с отличной ценой
Онлайн чат-партнерство
Пиломатериалы для возведения бани
Почему VDSina — лучший выбор хостинга
Секреты Вконтакте: тонкости и хитрости
Скидки до 50% на тур в Коста-Рике
Видеочат рулетка бесплатно