我有一个网页,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
你有两个独立的问题:
example.com
,而不管最初访问哪个特定的域。 发生这种情况是因为您使用的$server_name
变量实际上是给定server
上下文中的一个静态变量,并且与$http_host
具有非常远的关系。
正确的方法是使用$host
而不是使用$http_host
进行边角清理。
https://example.com
,您收到连接问题,但不是https://www.example.com
。 您的问题没有足够的信息来查明这个问题的确切来源。
它可能是一个DNS问题( example.com
A
/ AAAA
记录设置在一个IP地址,在那里没有适当的绑定到https
端口)。
这可能是一个与不匹配的证书有关的问题:
您的证书是否覆盖example.com
和www.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有效,我注意到你已经说过了。