Nginx перенаправляет весь трафик, не относящийся к www, на www на портах 80 и 443

#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 . Спасибо за ответ и ссылки на источники. 👍