nginx HTTPS WWW 重定向到非 WWW

Jam*_* Gu 8 ssl nginx https

我的 SSL 证书用于 mydomain.com,所以我试图将所有 www.mydomain.com 重定向到不带 www 的。现在,所有这些工作:

http://www.mydomain.com
http://mydomain.com
https://mydomain.com
Run Code Online (Sandbox Code Playgroud)

但是https://www.mydomain.com向浏览器发出“站点不安全”警告..​​....我尝试设置如下重定向,但请告诉我我的脚本在哪里有问题......

     server {
        listen      80;
        server_name www.mydomain.com mydomain.com;
        rewrite     ^(.*)   https://mydomain.com$1 permanent;
        client_max_body_size 100M;
            location / {
                   index    index.htm index.html index.php;
            }

            location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
            }


    }



    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;


        server_name www.mydomain.com;
        rewrite ^(.*) https://mydomain.com$1 permanent;

    }





    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;
        client_max_body_size 100M;
        server_name mydomain.com;
        root /var/www/mysite;
        index index.php;

        location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
        }


    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*sen 14

您的配置脚本没有问题。

使用您当前的配置(假设您安装了标准的单主题 SSL 证书),这不是一个选项

这样做的原因是 https 连接的工作方式:

当客户端(浏览器)向服务器(nginx)发出 https 请求时,它会通过 SSL 握手启动 SSL 会话。当且仅当握手成功并建立会话时,浏览器才会发送包含主机名的实际 HTTP 请求。因为 SSL/TLS 不仅是为数据连接提供加密的一种方式,也是服务器向客户端进行身份验证的一种方式。作为身份验证过程的一部分,浏览器会验证服务器的身份。验证检查之一是将证书主题名称与浏览器打算从中请求内容的主机名相匹配。如果此验证失败,浏览器会向用户发出警告。

由于验证过程失败,服务器永远不会在端口 443 侦听器上收到 www.mydomain.com 的 HTTP 请求,因此无法向客户端/浏览器发送重定向响应。

要启用从https://www.mydomain.com/https://mydomain.com 的重定向,您有几个选择,但归根结底是:您需要一个带有每个主机名主题的证书。

  1. SAN证书

    • 获得 UC/SAN 证书,并将 www.mydomain.com 添加为 SAN(主题备用名称)
    • 主题现在匹配对两者的请求mydomain.comwww.mydomain.com
  2. 多个 IP 地址

    • 为您的服务器获取另一个 IP 地址。
    • 获取具有主题名称的 SSL 证书 www.mydomain.com
    • 配置www.mydomain.comhttpsserver以侦听新 IP 地址(仍然是端口 443)
    • 配置www.mydomain.comhttpsserver以使用新证书
    • 更新 www.mydomain.com 的 A 记录以指向公共 DNS 区域中的新 IP 地址
  3. TLS SNI

    • 像上面的例子一样,获取一个带有主题名称的 SSL 证书 www.mydomain.com
    • 不使用其他 IP 地址,而是利用服务器名称指示TLS 扩展。

由于 SNI 的浏览器支持有限,我会避免建议 3。如果您愿意,请查看SNI 上nginx 文档(页面底部)

更新:一些证书颁发机构提供带有免费附加 SANwww.前缀的单一主题证书。


cns*_*nst 6

如果您的域不匹配,您将无法避免“站点不安全”警告。您的证书必须对您要通过 HTTPS 提供服务的每个域都有效,包括仅重定向域。

如果您的证书是无效的“www.example.com”,是只适用于“example.com”,则无法从重定向https://www.example.com/https://example.com/无安全警告。