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

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

Блог MAATRIX · 2026-07-07

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

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

['Редирект с HTTP на HTTPS должен быть постоянным (код 301), а не временным (302). 301 сообщает браузерам и поисковикам, что канонический адрес — защищённый, и они запоминают это, экономя лишний запрос.', 'Неправильный способ — редиректить через if внутри одного server-блока или ловить ошибку 497. Правильный — отдельный server-блок на 80 порту, который только перенаправляет.']

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

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

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

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

['Разделите конфиг на два блока. Первый слушает 80 и редиректит всё на HTTPS:', '
server {\n    listen 80;\n    listen [::]:80;\n    server_name example.com www.example.com;\n    return 301 https://$host$request_uri;\n}
', 'Второй блок обслуживает сам HTTPS:', '
server {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n    server_name example.com www.example.com;\n\n    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n\n    root /var/www/example.com;\n    index index.html;\n}
', 'Конструкция $host$request_uri сохраняет и домен, и путь с параметрами — пользователь попадёт на ту же страницу, но по HTTPS.']

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

['Часто нужно свести оба варианта домена к одному каноническому. Добавьте отдельный блок для www:', '
server {\n    listen 443 ssl;\n    server_name www.example.com;\n    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n    return 301 https://example.com$request_uri;\n}
', "Сертификат должен покрывать оба имени (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\nsystemctl reload nginx
', 'Убедитесь, что редирект отдаёт 301 и ведёт на HTTPS:', '
curl -I http://example.com\n# ожидаем: HTTP/1.1 301 Moved Permanently\n#          Location: https://example.com/
', 'Проверьте всю цепочку переходов сразу:', '
curl -IL http://www.example.com
', 'На NVMe-серверах MAATRIX nginx перечитывает конфиг мгновенно, а TLS-хендшейк на AMD EPYC не становится узким местом даже под нагрузкой.']

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

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

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

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

Почему после настройки видна ошибка 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.