.htaccess重定向仅在浏览器警告后执行
我有一个强制HTTPS和www的重写规则。 SSL证书适用于该网站的www版本。整个网站需要是HTTPS。.htaccess重定向仅在浏览器警告后执行
问题是如果请求是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/
我怎样才能重定向到浏览器的警告之前执行?
从https://example.com
到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.com
和www.example.com
,有时无需支付额外费用。
注意:大多数通配符证书都包含'* .example.com'和'example.com' – cmorrissey 2014-02-07 15:32:33
This post地址您的问题,并提供了以下答案:
,如果你想避免无效的证书问题,你需要的example.com一个证书。出于安全原因,不允许在身份验证之前重定向。
另一个选择可能是获得通配证书,这将允许您匹配
(显然这是不行的。感谢@Giel)*.example.com
。
你可以做http://example.com/
重定向到https://www.example.com/
,但可能不会帮助你,如果你已经有用户访问https://example.com/
。
通配符证书是不够的,因为后者与前者不匹配,您将需要example.com和* .example.com。 – Giel 2012-07-24 22:32:02
请参阅:http://serverfault.com/a/360985/47187 – Bruno 2012-07-24 22:31:25
可能重复[重定向https到非www和http到www](http://stackoverflow.com/a/10726167/372643)。 – Bruno 2012-07-24 22:59:33
这个问题可能是重复的,但我认为这里的问题更清楚一点,恕我直言。 – Jonathan 2012-07-25 07:51:02