将非www重定向到www https nginx(SSL_ERROR_BAD_CERT_DOMAIN)

时间:2019-01-09 12:35:43

标签: ubuntu ssl nginx

我刚刚注意到,如果没有www

,则无法在https上访问我的页面之一

所以我们有四种不同的情况:

http://example.com <-有效

https://example.com <- 不起作用

http://www.example.com有效

https://www.example.com有效

情况是,对于每个请求,无论您选择上述哪种路线,都应始终以https://www.example.com

结尾

我不是第一个遇到此问题的人,我尝试了许多情况,但没有任何运气(例如,这些解决方案:here

当我尝试访问https://example.com时,我得到一个SSL_ERROR_BAD_CERT_DOMAIN。因此,该证书仅对www.example.com有效,这是有道理的。但我还有另一份适用于example.com的证书。

知道,我的NGINX设置如下:

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;

        return 301 https://www.example.com$request_uri;
}


server {
        listen 443 default_server ssl;
        server_name www.example.com;

        root /home/build/;
        index index.html index.htm;

        ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;

        location / {
                try_files $uri /index.html;
        }
}

server {
        listen 80;
        server_name www.example.com example.com;
        return 301 https://www.example.com$request_uri;
}

我使用NGINX已有一段时间了,实际上直到最近我才意识到我遇到了这个问题。 我知道我可以在有www和没有www.example.com的情况下提供页面,这将解决问题。但我希望每次互动都应在www上进行,而不要没有git remote -v

我正在Ubuntu 18.04上运行NGINX版本1.14.0。

所有帮助均已申请。

1 个答案:

答案 0 :(得分:0)

如果有人有兴趣,我就解决了这个问题。

我没有通配证书,而是获得了通配符证书,并向其中添加了根域。

因为在本例中使用的LetsEncrypt还提供了免费的通配符证书,所以我的所有子域和根域都可以使用相同的证书。

安装通配符证书后,我的NGINX文件如下所示:

server {
        listen 443 default_server ssl;
        server_name www.example.com;

        root /home/build/;
        index index.html index.htm;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        location / {
                try_files $uri /index.html;
        }
}

server {
        server_name www.example.com example.com;
        return 301 https://www.example.com$request_uri;

    listen 443 ssl;
    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;
}

server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    }


    if ($host ~ ^[^.]+\.example\.com$) {
        return 301 https://$host$request_uri;
    }


        listen 80;
        server_name www.example.com example.com;
    return 404;
}

应该说,代码的最后部分非常受certbot的设置启发。