.htaccess 重定向仅在浏览器警告后执行

Posted

技术标签:

【中文标题】.htaccess 重定向仅在浏览器警告后执行【英文标题】:.htaccess redirect only executes after browser warning 【发布时间】:2012-07-23 07:43:38 【问题描述】:

我有一个强制 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/

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

【问题讨论】:

见:serverfault.com/a/360985/47187 Redirect https to non-www and http to www 的可能重复项。 这个问题可能是重复的,但我认为这里的问题说得更清楚一些,恕我直言。 如果您搜索“certificate ssl www non-www”(在 SO、SF 或 Webmasters.SE 上),会有很多问题,但我想其中一些问题确实并不完全清楚。 【参考方案1】:

This post 解决您的问题,并提供以下答案:

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

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

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

【讨论】:

一个通配符证书是不够的,你需要 example.com 和 *.example.com 因为后者与前者不匹配。【参考方案2】:

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

这是因为 HTTPS 是基于 TLS/SSL 的 HTTP(请参阅 RFC 2818),它首先建立 SSL/TLS 连接,然后再发送任何 HTTP 流量。 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 颁发包含example.comwww.example.com 的 SAN 条目的证书是很常见的,有时无需额外费用。

【讨论】:

注意:大多数通配符证书包括*.example.comexample.com

以上是关于.htaccess 重定向仅在浏览器警告后执行的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 重定向桌面但不适用于移动浏览器

检测浏览器是不是正在执行重定向

使用基于浏览器语言的 htaccess 从和到子域重定向

.htaccess 仅在 GET 参数存在时重定向

如何在不更改浏览器中的 URL 的情况下使用 htaccess 进行重定向

Laravel SSL .htaccess 重定向到 index.php