#http #nginx #https #ssl-certificate
#http #nginx #https #ssl-сертификат
Вопрос:
Мой серверный блок Nginx в настоящее время настроен для обслуживания как трафика, не относящегося к www, так и трафика www. Как я могу настроить свой серверный блок на:
http://example.com следует перейти к: https://www.example.com
https://example.com следует перейти к: https://www.example.com
Вот что у меня сейчас есть:
server {
root /var/www/example.com;
index index.html index.htm index.nginx-debian.html index.php;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 404; # managed by Certbot
}
Комментарии:
1. Включает ли ваш сертификат оба
example.com
иwww.example.com
доменные имена?2. Да, это так. Оба работают.
Ответ №1:
Разделите блок вашего SSL-сервера на два:
server {
server_name example.com;
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
return 301 https://www.example.com$request_uri;
}
server {
server_name www.example.com;
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
root /var/www/example.com;
index index.html index.htm index.nginx-debian.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
Оставьте серверный блок, который прослушивает порт 80, как есть.
Комментарии:
1. Я ввел nginx -t и получил: nginx: [emerg] дублирует параметры прослушивания для [::]:443 в /etc/nginx/sites-enabled/example.com:14 nginx: файл конфигурации /etc/nginx/nginx.conf не прошел тест
2. @GTSJoe Согласно этому ответу и комментариям ниже, которые вы не должны использовать
ipv6only=on
, простоlisten 443 ssl; listen [::]:443 ssl;
.3. @GTSJoe А вот несколько заметок о certbot от Майкла Хэмптона . Я согласился с ним по поводу certbot и уродливой конфигурации, которую он обычно создает.
4. Отлично! Теперь он работает после удаления ipv6only=on . Спасибо за ответ и ссылки на источники. 👍