Редирект HTTP → HTTPS на nginx
Сертификат установлен, но сайт всё ещё открывается по 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.