我有这迫使HTTPS和www重写规则。 SSL证书是网站的WWW版本。 整个网站需要HTTPS。
问题是,如果请求https://example.com/浏览器显示之前重定向可以执行一个警告页面。 (“此连接不受信任”在Firefox和“这可能不是您要查找的网站!”在Chrome)
如果用户将在Firefox异常或忽略Chrome的错误,重写规则执行和他们重定向到该网站的WWW版采用了100%的安全页面。
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上的HTTP TLS / SSL(参见RFC 2818 ),该第一建立SSL /任何HTTP通信之前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
。 (显然,这是行不通的。谢谢@Giel)
你可以做http://example.com/
重定向到https://www.example.com/
,但可能不会帮助你,如果你已经有用户访问https://example.com/
。