为啥浏览器会为 http://example.com 缓存 301 重定向并将其用于 http://example.com:8080?
Posted
技术标签:
【中文标题】为啥浏览器会为 http://example.com 缓存 301 重定向并将其用于 http://example.com:8080?【英文标题】:Why browsers caches 301 redirect for http://example.com and use it for http://example.com:8080?为什么浏览器会为 http://example.com 缓存 301 重定向并将其用于 http://example.com:8080? 【发布时间】:2017-06-04 06:09:49 【问题描述】:我的 CentOS 服务器上有两个不同的 Web 服务器(NGINX 和 nodejs)上的两个站点。 在我的 nginx 配置中,我已将 http://example.com 设置为重定向到 https://example.com 永久。 另一方面,URL http://example.com:8080 由 nodejs 处理,不会重定向到任何地方。
场景
当我在浏览器(Chrome、firefox 或 safari)中请求 http://example.com 时,它会被重定向到 https://example.com 这没关系。当我输入 http://example.com:8080 时,它也被重定向到 https://example.com:8080,这是不正确的。
当我清除浏览器缓存时,URL http://example.com:8080 工作正常,但在输入 http://example.com 之后,URL http://example.com:8080 再次重定向到 HTTPS。谁能帮我解决这个问题?
【问题讨论】:
【参考方案1】:您可能会体验到HTTP Strict Transport Security (HSTS) 规范所定义的内容。
您需要检查https://example.com
请求的响应。它可能包含Strict-Transport-Security
标头,指示浏览器重写所有example.com
domain 请求的URI 以使用安全方案。来自 HTTP 严格传输安全 (HSTS) 规范 8.3. URI Loading and Port Mapping section 的相关摘录:
UA 必须将 URI 方案替换为“https”[RFC2818],并且 如果 URI 包含“80”的显式端口组件,则 UA 必须将端口组件转换为“443”,或者
如果 URI 包含一个明确的端口组件,该组件不是 等于“80”,端口组件值必须保留; 否则,
如果 URI 不包含显式端口组件,则 UA 不得添加。
注意:这些步骤可确保 HSTS 政策适用于 HTTP 通过 HSTS 主机的任何 TCP 端口。
注意:在提供显式端口的情况下(以及 较小程度的子域),很可能是 实际上有一个 HTTP(即非安全)服务器正在运行 指定的端口,因此 HTTPS 请求将失败 (参见附录 A(“设计决策说明”)中的第 6 项)。
更多信息请查看Strict-Transport-Security MDN page。
【讨论】:
哇,它成功了。非常感谢@Leonid。我从 NGINX 中删除了add_header Strict-Transport-Security max-age=15768000
,它起作用了。以上是关于为啥浏览器会为 http://example.com 缓存 301 重定向并将其用于 http://example.com:8080?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的页面在刷新期间会在 Chrome 中触发“就绪”事件?