Настройка HTTPS (Certbot) и правильный редирект www → non-www в Nginx
Полный гайд по редиректам в Nginx: убираем www, настраиваем принудительный HTTPS и получаем бесплатные SSL-сертификаты через Certbot (Let's Encrypt). Рабочие примеры конфигов для продакшена.
Чтобы сайт не открывался по двум адресам (www.example.com и example.com), нужно настроить 301-редирект. Это важно для SEO (исключает дубли страниц) и безопасности (принудительный HTTPS).
В этой статье:
- Как получить бесплатный SSL-сертификат (Certbot).
- Как настроить "идеальный" редирект без лишних перенаправлений.
Шаг 1. Установка SSL (Certbot)
Если у вас ещё нет HTTPS, начните с него. Самый простой способ — использовать Certbot (клиент для Let's Encrypt).
Установка (Ubuntu/Debian)
Лучший способ установки — через snap (официальная рекомендация):
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Либо через apt: sudo apt install certbot python3-certbot-nginx
Получение сертификата
Запустите команду для обоих доменов (с www и без):
sudo certbot --nginx -d example.com -d www.example.com
Certbot сам пропишет пути к сертификатам в вашем конфиге Nginx.
Шаг 2. Настройка редиректа в Nginx
Откройте конфиг вашего сайта (обычно в /etc/nginx/sites-available/default или example.com):
Вариант 1. "Идеальный" (Best Practice)
Этот метод избегает двойного редиректа. Запрос на http://www.example.com сразу летит на https://example.com, минуя промежуточные шаги.
Вам нужно три блока server:
- HTTP (порт 80) — ловит всё и шлёт на HTTPS:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
- HTTPS с WWW (порт 443) — редиректит на "без www":
server {
listen 443 ssl;
server_name www.example.com;
# Пути, которые добавил Certbot (проверьте свои!)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
return 301 https://example.com$request_uri;
}
- HTTPS основной (порт 443) — ваш рабочий сайт:
server {
listen 443 ssl;
server_name example.com;
# Те же сертификаты
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/html;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
Шаг 3. Проверка и перезагрузка
Всегда проверяйте конфигурацию перед применением:
nginx -t
Если всё ок (syntax is ok), перезагрузите Nginx:
systemctl reload nginx
Теперь ваш сайт доступен только по https://example.com. Любые попытки зайти через HTTP или WWW будут автоматически перенаправлены.