我有一个支持 HTTPS 的网站:所有页面的表单http://example.com/foo可以作为https://example.com/foo(查询将返回相同的内容)。也就是说,该网站不包含任何机密信息,因此使用 HTTPS 并没有什么好处。
我想宣传该网站的 HTTPS 版本,但我不想强迫人们使用它:一些较旧的客户端可能不支持它,一些高级用户可能不喜欢使用它,等等。出于这个原因,我不希望服务器使用重定向来回答未加密的 HTTP 请求。也就是说,对于喜欢使用 HTTPS 的用户,必须有一种方法让他们发现 HTTPS 受支持。(Web 浏览器不会主动尝试将 HTTP 连接升级到 HTTPS,例如,因为有些网站在 HTTPS 上提供的内容与在 HTTP 上提供的内容不同。)
有没有一种方法可以让 Web 服务器宣传其支持 HTTPS(即,任何请求都可以使用 HTTPS 而不是 HTTP 来完成),而无需客户端使用 HTTPS?
我发现的唯一相关机制是Upgrade: TLS/1.0
来自RFC2817,显然服务器和客户端都可以发送该消息。但我不清楚这是否常用,或者 Web 浏览器是否支持该消息。
答案1
以下内容不是特定于 HTTPS 的,但可用于轻轻地引导客户端走向 HTTPS。
如果您在多个 URL 下提供相同的内容(如果您允许 HTTP 和 HTTPS,则会出现这种情况),则应将规范标签添加到您提供的内容中。然后,该规范标签会标识访问内容的首选方式。
假设您拥有“example.com”并为此托管了一个网站。此网站可使用 HTTP 和 HTTPS 访问,可使用“example.com”和“www.example.com”,主页可在“/”和“/default.html”下访问(无论出于何种历史原因)。因此,可以使用以下方式访问主页:
- http://example.com/
- http://example.com/default.html
- https://example.com/
- https://example.com/default.html
- http://www.example.com/
- http://www.example.com/default.html
- https://www.example.com/
- https://www.example.com/default.html
然后你决定默认情况下每个人都应该使用https://www.example.com/default.html访问您的网站主页,但您不想添加任何重定向。
您可以在主页<head>
部分添加以下标签
<link rel="canonical" href="https://www.example.com/default.html" />
这将告诉每个网络爬虫(即 Google)和浏览器,它现在正在查看的内容在该 URL 上可用。然后客户端软件本身可以决定如何处理该信息。
缺点是您必须向您提供的每个 HTML 文档添加这样的标签,并且它仅适用于 HTML。
答案2
除了 rel="canonical" 机制之外,如今一种常见的解决方案似乎是使用“Upgrade-Insecure-Requests: 1”标头(Firefox 和 Chrome 在发出纯 HTTP 请求时显然会发送此标头)。这些客户端就是这样宣传它们支持 HTTPS 的,然后服务器应该将它们重定向到 HTTPS 版本。
看这里关于如何使其与 lighttpd 一起工作的问题。