我已经阅读了一些关于 SF 的答案,但我离解决方案还差得远。我的问题似乎有点具体......
客户在端口 81 上访问网络服务器。随着 HTTPS 的总体趋势,该服务被升级并安装在标准端口 443 上。对我的故事至关重要的是,HSTS 在新的 HTTPS 网站上启用。
在端口 81 上,我们放置了一个简单的 Apache 重定向:
ServerName example.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://example.com/ [END,NE,R=permanent]
有效。访问http://example.com:81会自动重定向到https://example.com/
然而,多亏了 HSTS,它只工作一次。我想许多用户正在通过链接、书签、缓存的 Google 搜索进行访问……并自动被定向到http://example.com:81。甚至我的浏览器的自动完成功能仍然喜欢建议 :81 链接,所以我猜我不是唯一一个。
他们的浏览器具有有效的 HSTS 策略会对不安全的请求执行内部升级,从而导致浏览器向https://example.com:81发送请求。由于 SSL 错误而无法加载 - 端口未配置用于 SSL 流量。
因此,我需要一种将http://example.com:81和https://example.com:81重定向到https://example.com的方法
我见过 Webmin,当通过http://example.com:10000访问时,会给出一条自定义错误消息,说明该站点在 HTTPS 上处于活动状态,这是由 Webmin 而不是浏览器生成的。即使我可以让这样的页面加载并实现<meta>
对新 URL 的刷新,当旧 URL 自行播放并从链接、缓存等中删除时,这仍然会取悦我们的用户。
我通过在端口 81 上启用 HTTPS 解决了这个问题。这在请求 HTTP 版本时生成了“400 Bad Request”响应(即第一次发出请求,在 HSTS 可以覆盖请求之前)。我将 Apache 配置为通过重定向响应 400 错误:
这意味着首次请求通过 400 错误重定向定向到 HTTPS 站点,随后通过 HTTPS 到非标准端口的请求通过
RewriteRule
.对 HTTPS 端口发出的 HTTP 请求可能会显示服务器生成的错误(这就是 Webmin 可以显示“不错”错误消息的原因)。另一方面,对 HTTP 端口的 HTTPS 请求不会产生错误,因为浏览器永远无法建立通信通道。