Nginx 反向代理强制子域名使用 301(但其实不应该)

Nginx 反向代理强制子域名使用 301(但其实不应该)

因此,我使用 Nginx (1.4.3) 反向代理域和子域。我安装了 SSL 证书来处理主域 (example.com) 和几个子域(比如 test.example.com 和 mail.example.com)。因此,我自然而然地使用 301 返回将 http 请求移至 https。

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

效果很好。但是,如果我在 HTTPS SSL 证书下引入另一个我不想要的子域(因为我没有通配符证书,并且这个子域不需要它)。Nginx 似乎仍会对其应用 301,即使已server_name隐式设置。由于它是 1.4.3,我已将它们拆分到conf.d文件夹中。

我认为它之所以这样做是因为如果我清除浏览器缓存并导航到新的子域 (sd.example.com),它会正常工作并且不会重写为 https。但是如果我转到主站点 (example.com),重写就会启动,我会被发送到https://example.com,没有任何问题。但是,如果我尝试返回 sd.example.com,则会被重写为https://sd.example.com并弹出大红色镀铬错误。

知道为什么会发生这种情况吗?我宁愿停止为此烦恼。

答案1

发布了 OP 评论的答案

问题是由 HSTS 标头引起的。在主域中,有一个条目includeSubDomains在 HSTS 中标头。如果浏览器访问主域并收到该 HSTS 标头,则浏览器将强制通过 HTTPS 进行连接主域名和子域名。因此,很明显 nginx 不会导致重定向。

如果您不希望子域名使用 HTTPS,解决方案是includeSubDomains在 HSTS 标头中删除。

相关内容