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 Certs下引入另一个不需要的子域(因为我没有通配证书并且不需要此子域)。 尽pipeserver_name已经被隐式设置了,Nginx似乎还是应用了301。 由于它是1.4.3,我把它们分解在conf.d文件夹中。

我认为这是因为如果我清除我的浏览器caching,并导航到新的子域(sd.example.com),它工作正常,不重写为https。 但是,如果我去主网站(example.com)重写踢,我发送到https://example.com ,没有问题。 但是,如果我尝试返回到sd.example.com,则会被重写为https://sd.example.com,并且会popup一个大红色的错误消息。

任何想法为什么发生这种情况? 我宁愿停止在这一个敲我的头。

张贴OP评论的答案

这个问题是由HSTS头造成的。 在主域中, 在HSTS报头中有条目includeSubDomains域。 如果浏览器访问主域并接收到HSTS头,则浏览器将强制通过主域和子域中的 HTTPS进行连接。 所以,它非常清楚,nginx不会导致redirect。

如果您不希望子域使用HTTPS,则解决scheme是在HSTS标头中删除includeSubDomains