我有一个 Apache 2.2 服务器和一个 *.domain.com 的通配符 SSL 证书,并且为 80 和 443 设置了 mod_rewrite 规则集,可以正确地将对 domain.com 的请求重定向到 www.domain.com:
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule ^(.*)$ https://www.domain.com$1 [R=permanent,L]
(这是 443 的;80 的只是省略了“https”中的“s”)。
这部分对于 http 和 https 都正常工作 - 它确实进行了重写 - 但它并没有完全解决我想要修复的问题。具体来说,当有人访问时https://domain.com
,他们会收到证书警告,因为 *.domain.com 的通配符证书不只与 domain.com 匹配。如果他们选择接受证书并继续,则重写将正常进行,正常的锁定图标将取代愤怒的锁定图标。问题是他们首先会收到警告 - 他们必须选择在重写完成之前忽略证书警告。在尝试进行 SSL 协商之前,是否有正确的方法将流量发送到https://domain.com
?https://www.domain.com
看起来 mod_rewrite 是在事后进行的。
答案1
SSL 协商总是在 HTTP 请求开始之前发生,没有办法避免。
解决此问题的唯一方法是获取同时列出domain.com
和的新证书*.domain.com
。
答案2
正如 Tero 已经指出的那样,SSL 协商在mod_rewrite
启动之前发生。这意味着您解决此问题的唯一方法是获取对以下设备也有效的证书:域名.com。
由于 Apache 支持 SNI,它可以为不同的主机名提供不同的证书,因此您可以在 StartSSL 这样的公司获得便宜或免费的附加证书。
不过,根据我的经验,人们很少https://
在地址栏中输入内容,所以如果你只是确保http://domain.com
直接重定向到https://www.domain.com
,那就没有问题了。