.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/

我怎样才能重定向到浏览器的警告之前执行?

+0

请参阅:http://serverfault.com/a/360985/47187 – Bruno 2012-07-24 22:31:25

+0

可能重复[重定向https到非www和http到www](http://*.com/a/10726167/372643)。 – Bruno 2012-07-24 22:59:33

+0

这个问题可能是重复的,但我认为这里的问题更清楚一点,恕我直言。 – Jonathan 2012-07-25 07:51:02

https://example.comhttps://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.comwww.example.com有效的单一证书。这可以通过获取具有多个主题备用名称(SAN)DNS条目的证书来实现(由于该点不是通配符模式的一部分,所以它不会与*.example.com一起使用)。

后者无疑是最简单的解决方案。当您申请其中一个或另一个时,CA有时会发出拥有SAN条目的证书,这些证书的有效期为example.comwww.example.com,有时无需支付额外费用。

+0

注意:大多数通配符证书都包含'* .example.com'和'example.com' – cmorrissey 2014-02-07 15:32:33

This post地址您的问题,并提供了以下答案:

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

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

你可以做http://example.com/重定向到https://www.example.com/,但可能不会帮助你,如果你已经有用户访问https://example.com/

+0

通配符证书是不够的,因为后者与前者不匹配,您将需要example.com和* .example.com。 – Giel 2012-07-24 22:32:02