nginx HTTPS WWW重定向到非WWW

nginx HTTPS WWW重定向到非WWW

我的 SSL 证书适用于 mydomain.com,因此我尝试将 www.mydomain.com 全部重定向到不带 www 的域名。现在,所有这些都有效:

http://www.mydomain.com
http://mydomain.com
https://mydomain.com

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;
        }


    }

答案1

您的配置脚本没有错误。

使用您当前的配置(假设您已安装标准单一主题 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

    • 像上面的例子一样,获取一个主题名称为www.mydomain.com
    • 无需使用其他 IP 地址,即可利用服务器名称指示TLS 扩展。

由于 SNI 对浏览器的支持有限,因此我会避免建议 3。请查看nginx 关于 SNI 的文档如果你喜欢(页面底部)

更新:一些证书颁发机构提供单一主题证书,并为前缀提供免费的附加 SAN www.

答案2

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

如果您的证书对“www.example.com”无效,仅对“example.com”有效,那么您无法从https://www.example.com/https://example.com/没有安全警告。

答案3

你可以尝试这个:

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

否则,您可以获得通配符证书,它将覆盖所有三级域名。

相关内容