浏览器将 HTTP 站点缓存为 HTTPS,导致从站点导航到 HTTPS 目标时出现证书错误

Browser caches HTTP site as HTTPS resulting in Cert Error when navigating from site to an HTTPS destination

我有一个托管为 https://foo.bar.com 的公司网站。

但是,许多用户错误地了解到 URL 应该是 www.foo.bar.com。在解决此问题之前,我们将通过设置代理站点 www.foo.bar.com 来实施临时解决方案,该代理站点会将所有访问它的用户重定向到 https://foo.bar.com.

这有效...但仅在用户第一次导航到该页面时有效。下次我尝试访问 www.foo.bar.com 时,由于缓存,浏览器将我带到 https://www.foo.bar.com. We don't have a certificate set up for https://www.foo.bar.com,结果给出 NET::ERR_CERT_COMMON_NAME_INVALID 错误。

有没有办法在不需要证书的情况下解决这个问题?

为了测试,我什至尝试过当我导航到 www.foo.bar.com 时返回一个网页,而 link 导航到 https://foo.bar.com。但是,即使在这种情况下也会发生同样的问题。我猜 HSTS 在这里发挥作用,但不确定如何去做。

如果您对此事有任何见解,我将不胜感激,在此先感谢您。

我认为解决您问题的唯一方法是为 www.foo.bar.com 获取有效证书。由于证书错误,浏览器不会尝试与您的服务器通信,因此您无法发出从错误域到正确域的重定向。

为什么只有第二次?

你提到了 HSTS,所以我假设 https://foo.bar.com 正在发送 Strict-Transport-Security header 作为其响应的一部分。此 header 可能与 includeSubDomains 选项一起发送,该选项指示浏览器不仅在 foo.bar.com 上而且在该主域的所有子域上强制执行 HTTPS。因此,当尝试请求 www.foo.bar.com 时,浏览器匹配该 HSTS 规则并自动 re-writes 它使用 HTTPS。

一旦在浏览器中设置了此 HSTS 规则,就无法将其删除,除非过期,或者通过超过原始 max-age 时间或通过发出另一个 Strict-transport-security header max-age=0https://foo.bar.com