为啥浏览器会为 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:8080nodejs 处理,不会重定向到任何地方。

场景

当我在浏览器(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?的主要内容,如果未能解决你的问题,请参考以下文章

在 WordPress 上浏览自定义分类术语

为啥我的页面在刷新期间会在 Chrome 中触发“就绪”事件?

为啥 XamlWriter 会为某些属性添加 ?

如果 XIB 中有更多***视图,为啥 outlet 会为零

为啥 Xcode 会为选择器添加自动完成方法?

为啥 django 1.7 会为字段选择的变化创建迁移?