Принудительный редирект с HTTP на HTTPS в Nginx
Дата публикации: 24.04.2026

Принудительный редирект с HTTP на HTTPS в Nginx

ccb9a536


Принудительный редирект с 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/posthttps://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.comexample.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;
    # ...
}

Логика:

  1. Все HTTP-запросы (порт 80) → редирект на HTTPS + не-WWW.
  2. HTTPS-запросы на www.example.com → редирект на example.com.
  3. Основной блок обрабатывает только 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. Проверка результата

После настройки проверьте:

  1. Ручной тест:
    • Откройте http://example.com → должен перейти на https://example.com.
    • Проверьте с www и без.
  2. Инструменты для вебмастеров:
  3. Команда 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.

Шаги:

  1. Откройте файл.
  2. Добавьте серверный блок для порта 80 с редиректом на HTTPS.
  3. Проверьте конфиг и перезагрузите Nginx.
  4. Протестируйте в браузере.

Упражнение 2. Редирект с WWW

Модифицируйте конфиг из Упражнения 1, чтобы:

  • Все запросы на www.test-site.ru перенаправлялись на https://test-site.ru.
  • Основной сайт работал только на https://test-site.ru (без www).

Упражнение 3. Массовый редирект

На сервере хостятся 5 сайтов:

  • site1.com
  • site2.com
  • blog.site1.com
  • shop.site2.com
  • old-project.com (должен остаться на HTTP)

Настройте один конфиг, который будет перенаправлять все сайты на HTTPS, кроме old-project.com.


Упражнение 4. Диагностика ошибок

Пользователь жалуется, что после настройки редиректа сайт example.org не открывается. При вводе http://example.org браузер показывает ошибку ERR_TOO_MANY_REDIRECTS.

Вопросы:

  1. В чем возможная причина?
  2. Как это исправить?

Упражнение 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% на тур в Коста-Рике
Видеочат рулетка бесплатно
рейтинг хостингов 2026 Быстрые VDS серверы