我有一个强制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/
如何在浏览器警告之前执行重定向?
答案 0 :(得分:9)
从https://example.com
到https://www.example.com
的重定向只能在客户端向https://example.com
发出初步成功请求后才会发生。
这是因为HTTPS是基于TLS / SSL的HTTP(请参阅RFC 2818),它首先在发送任何HTTP流量之前建立SSL / TLS连接。建立SSL / TLS连接后,mod_rewrite
将始终适用。不这样做实际上是一个安全问题,因为攻击者可以在证书验证之前重写和重定向客户端。即使TLS升级在HTTP(RFC 2817,实际上从未使用/支持且不是https),您仍然希望重定向来自可信实体。
要使此初始连接正常工作,https://example.com
的服务器必须具有对example.com
有效的证书,否则,甚至不会发生此连接(并且服务器不会发送重定向响应)。
要实现目标,您需要https://example.com
请求提供对example.com
有效的证书,并要求https://www.example.com
提供对www.example.com
有效的证书。
有两种解决方案:
example.com
和www.example.com
都有效的单一证书。这可以通过获取具有多个主题备用名称(SAN)DNS条目的证书来实现(由于该点不是通配符模式的一部分,因此不能仅使用*.example.com
。)后者无疑是最简单的解决方案。当您申请其中一个或另一个时,CA通常会为example.com
和www.example.com
颁发具有SAN条目的证书,这种情况很常见。
答案 1 :(得分:0)
This post解决了您的问题,并提供了以下答案:
如果您想避免无效的证书问题,则需要example.com的证书。出于安全原因,不允许在身份验证之前进行重定向。
另一种选择可能是获得通配符证书,这将允许您匹配(显然这不起作用。谢谢@Giel)*.example.com
。
您可以将http://example.com/
重定向到https://www.example.com/
,但如果您已有用户访问https://example.com/
,则可能无法帮助您。