9

我有一个强制 HTTPS 和 www 的重写规则。SSL 证书适用于网站的 www 版本。整个站点需要是 HTTPS。

问题是如果请求是https://example.com/,浏览器会在重定向执行之前显示一个警告页面。(Firefox 中的“此连接不受信任”和 Chrome 中的“这可能不是您要查找的站点!”)

如果用户在 Firefox 中添加异常或忽略 Chrome 中的错误,则会执行重写规则,并将他们重定向到具有 100% 安全页面的网站的 www 版本。

RewriteEngine on

RewriteCond %{HTTP_HOST} ^example.com$ [OR]
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

我一直在测试网站上的规则以及http://martinmelin.se/rewrite-rule-tester/

如何在浏览器警告之前执行重定向?

4

2 回答 2

9

https://example.com从to的重定向https://www.example.com只能在客户端向 发出初始成功请求后发生https://example.com

这是因为 HTTPS 是基于 TLS/SSL 的 HTTP(请参阅RFC 2818),它首先在发送任何 HTTP 流量之前建立 SSL/TLS 连接。mod_rewrite将始终在 SSL/TLS 连接建立后应用。不这样做实际上是一个安全问题,因为攻击者可以在证书验证之前重写和重定向客户端。即使 TLS 升级在 HTTP(RFC 2817,实际上从未使用/支持且不是 https)内,您仍然希望重定向来自受信任的实体。

为了使这个初始连接正常工作,服务器https://example.com必须有一个有效的证书example.com,否则,这个连接甚至不会发生(并且服务器不会发送重定向响应)。

为了实现您的目标,您需要请求https://example.com出示有效的证书example.com和请求https://www.example.com出示有效的证书www.example.com

有两种解决方案:

  • 通过使用不同的 IP 地址或使用服务器名称指示,为每个主机使用两个不同的证书。这里的缺点是并非所有客户端都支持 SNI,即使它越来越普遍。
  • example.com使用对和均有效的单一证书www.example.com。这可以通过获取具有多个主题备用名称 (SAN) DNS 条目的证书来实现(它不能使用,*.example.com因为点不是通配符模式的一部分)。

后者当然是最简单的解决方案。CA 为两者颁发具有 SAN 条目的证书是很常见的example.comwww.example.com当您申请其中一个或另一个时,有时无需额外费用。

于 2012-07-25T11:20:07.100 回答
1

这篇文章解决了您的问题,并提供了以下答案:

如果您想避免无效证书问题,您将需要 example.com 的证书。出于安全原因,不允许在身份验证之前进行重定向。

另一种选择可能是获取通配符证书,这将允许您匹配*.example.com. (显然这行不通。谢谢@Giel)

您可以http://example.com/重定向到https://www.example.com/,但如果您已经有用户访问,这可能对您没有帮助https://example.com/

于 2012-07-24T22:28:20.507 回答