Как настроить редирект с HTTP на HTTPS в Nginx: пошаговая инструкция
Признаки отсутствия переадресации на HTTPS
Когда на сайте установлен SSL-сертификат, но не настроено принудительное перенаправление, пользователи и поисковые роботы могут открывать сайт двумя разными путями:
| Тип подключения | Адрес в строке браузера | Статус безопасности |
|---|---|---|
| Незащищенный (HTTP) | http://example.com | «Не защищено» / Предупреждение браузера |
| Защищенный (HTTPS) | https://example.com | Замочек безопасности / Данные зашифрованы |
Это приводит к дублированию контента в поисковых системах (SEO-проблемы) и перехвату паролей посетителей, открывших сайт по обычному протоколу http://.
Пошаговая настройка 301 редиректа в Nginx
Для перенаправления всего трафика с порта 80 (HTTP) на порт 443 (HTTPS) используется директива return 301.
- Откройте конфигурационный файл вашего виртуального хоста в редакторе Nano:
sudo nano /etc/nginx/sites-available/example.com - Добавьте отдельный блок
serverдля прослушивания 80-го порта в самое начало файла:server { listen 80; listen [::]:80; server_name example.com www.example.com; # Принудительный 301 постоянный редирект на HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; 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/html; index index.html index.php; location / { try_files $uri $uri/ =404; } } - Проверьте конфигурацию на ошибки синтаксиса:
sudo nginx -t - Примените изменения без остановки сервера:
sudo systemctl reload nginx
Важно: Переменная $host$request_uri сохраняет точный путь запроса. Например, если пользователь зашел на http://example.com/contacts.html, он будет перенаправлен на https://example.com/contacts.html, а не на главную страницу.
Частые вопросы (FAQ)
Чем отличается редирект 301 от 302?
Код 301 (Moved Permanently) сообщает браузерам и поисковикам, что адрес перенесен навсегда. Поисковый вес страницы полностью передается на HTTPS версию. Код 302 сообщает о временном переносе и не склеивает адреса.
Что делать, если возникает циклическая переадресация (ERR_TOO_MANY_REDIRECTS)?
Такая ошибка возникает, если ваш сайт находится за прокси-сервером (например, Cloudflare) и между Nginx и Cloudflare трафик идет по HTTP, в то время как Nginx пытается снова сделать редирект. Включите режим SSL 'Full' в Cloudflare.
Как проверить работу редиректа без браузера?
Выполните в терминале команду: curl -IL http://example.com. В ответе первой строчкой должно быть HTTP/1.1 301 Moved Permanently с указанием заголовка Location: https://example.com/.
Как перенаправить трафик с www на версию без www одновременно с переходом на HTTPS?
В блоке 80 и 443 для домена с www укажите return 301 https://example.com$request_uri;, прописав основной сайт отдельным блоком.