如何解决与Nginx的httpredirect?

我有一个网页,httpredirect有点破碎。

目前的行为是这样的:

www.example.com,example.com, http://www.example.com,http : //example.com,https : //www.example.com都被redirect到https://www.example.com

https://example.com得到错误说拒绝连接。

我想要的行为是这样的:

example.com, http://example.com,https://example.comredirect到https://example.com

www.example.com, http://www.example.com,https://www.example.comredirect到https://www.example.com

这是我的Nginxconfiguration文件

server { listen 80 default_server; listen [::]:80 default_server; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } server { add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location ~ /.well-known { allow all; } location / { try_files $uri $uri/ =404; } } 

原因是因为我想要这些链接工作

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

https://www.ssllabs.com/ssltest/analyze.html?d=www.example.com

https://hstspreload.org/?domain=example.com

https://hstspreload.org/?domain=www.example.com

你有两个独立的问题:


  1. 您的请求全部重定向到example.com ,而不管最初访问哪个特定的域。

发生这种情况是因为您使用的$server_name变量实际上是给定server上下文中的一个静态变量,并且与$http_host具有非常远的关系。

正确的方法是使用$host而不是使用$http_host进行边角清理。


  1. 尝试联系https://example.com ,您收到连接问题,但不是https://www.example.com

您的问题没有足够的信息来查明这个问题的确切来源。

它可能是一个DNS问题( example.com A / AAAA记录设置在一个IP地址,在那里没有适当的绑定到https端口)。

这可能是一个与不匹配的证书有关的问题:

  • 您的证书是否覆盖example.comwww.example.com ? 如果没有,那么你不能拥有两个。

  • 如果您拥有单独的证书,则可能还需要获取单独的IP地址,否则可能会由于缺乏SNI而阻止大量用户访问您的站点。


值得注意的是,还应该指出的是,在你的网站被访问的方式上没有一个统一的标记通常是一个马虎的做法。 特别是如果搜索引擎优化是你的任何问题,最好的做法是决定是否要去有或没有www ,坚持下去。

你需要这样的东西:

 server { listen 80 default_server; listen [::]:80 default_server; server_name example.com www.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name www.example.com; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload"; return 301 https://www.example.com$request_uri; } server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name example.com; root /var/www/html; index index.html index.htm index.nginx-debian.html; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload"; location ~ /.well-known { allow all; } location / { try_files $uri $uri/ =404; } } 

您的所有请求将最终路由到https://example.com 。 你的SSL证书也应该对https://www.example.com有效,我注意到你已经说过了。