MAATRIX / Блог / Редирект HTTP → HTTPS на nginx

Редирект HTTP → HTTPS на nginx

Редирект HTTP → HTTPS на nginx: правильная настройка
Блог MAATRIX · 2026-07-07

Сертификат установлен, но сайт всё ещё открывается по http:// — значит, редирект не настроен. Сделаем корректное 301-перенаправление, добавим HSTS и проверим результат командой, а не на глаз.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему нужен именно 301

Редирект с HTTP на HTTPS должен быть постоянным (код 301), а не временным (302). 301 сообщает браузерам и поисковикам, что канонический адрес — защищённый, и они запоминают это, экономя лишний запрос.

Неправильный способ — редиректить через if внутри одного server-блока или ловить ошибку 497. Правильный — отдельный server-блок на 80 порту, который только перенаправляет.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для сайта

Отдельный server-блок для 80 порта

Разделите конфиг на два блока. Первый слушает 80 и редиректит всё на HTTPS:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

Второй блок обслуживает сам HTTPS:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/example.com;
    index index.html;
}

Конструкция $host$request_uri сохраняет и домен, и путь с параметрами — пользователь попадёт на ту же страницу, но по HTTPS.

Редирект www → без www

Часто нужно свести оба варианта домена к одному каноническому. Добавьте отдельный блок для www:

server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    return 301 https://example.com$request_uri;
}

Сертификат должен покрывать оба имени (example.com и www.example.com) — Let's Encrypt выдаёт такой при указании обоих доменов в certbot.

HSTS: запрет отката на HTTP

HSTS-заголовок заставляет браузер ходить только по HTTPS в течение указанного срока, даже если пользователь введёт http://. Добавьте в HTTPS-блок:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Включайте HSTS только когда уверены, что HTTPS работает стабильно: откатиться назад в течение max-age будет нельзя — браузеры запомнят политику.

Применение и проверка

Проверьте синтаксис и перезагрузите nginx без разрыва соединений:

nginx -t
systemctl reload nginx

Убедитесь, что редирект отдаёт 301 и ведёт на HTTPS:

curl -I http://example.com
# ожидаем: HTTP/1.1 301 Moved Permanently
#          Location: https://example.com/

Проверьте всю цепочку переходов сразу:

curl -IL http://www.example.com

На NVMe-серверах MAATRIX nginx перечитывает конфиг мгновенно, а TLS-хендшейк на AMD EPYC не становится узким местом даже под нагрузкой.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для сайта

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Почему после настройки видна ошибка ERR_TOO_MANY_REDIRECTS?

Обычно из-за прокси (Cloudflare) в режиме Flexible: он ходит к серверу по HTTP, а сервер редиректит обратно. Переключите SSL-режим на Full.

Нужно ли редиректить внутри HTTPS-блока?

Нет. Держите редирект в отдельном блоке на 80 порту. Смешивание логики через if считается антипаттерном в nginx.

Как получить бесплатный сертификат?

Через certbot: apt install certbot python3-certbot-nginx, затем certbot --nginx -d example.com -d www.example.com.