如何将https://www.example.com重定向到https://example.com

时间:2011-04-25 14:46:16

标签: .htaccess mod-rewrite ssl redirect

我环顾四周,似乎无法找到明确的解决方案。对于在我们的域中输入的少数或访问者,我们遇到了一个小问题:

https://www.example.com - 这是一个安全警告“此网站的安全证书存在问题。”

我们为example.com

设置了SSL

因此,如果有人输入http://www.example.comwww.example.com,则会将其重定向到https://example.com,这样可以正常工作。

这是我目前在.htaccess文件中的内容:

Options +FollowSymLinks 
RewriteEngine on
RewriteCond %{SERVER_PORT} 80
RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,NC,L]

5 个答案:

答案 0 :(得分:2)

修改

大多数SSL证书是针对特定主机名发出的,例如www.example.com或仅example.com(并且*.example.com也可能存在通配符证书),所以可能就是这种情况。

也许在最后RewriteCond中将 www。子域名设为可选匹配可能有助于将用户带到证书中声明的域名:

<击>
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*) [NC]

<击>

答案 1 :(得分:2)

我认为问题不在于重写/重定向规则,而在于http服务器处理ssl连接的方式。甚至在服务器有机会查看重写/重定向规则之前,SSL握手就会发生,如果我们有example.com的证书,我们输入URL www.example.com连接将因证书无效而中止。检查自己,设置重定向条件,将URL www.example.com指向SSL安全域上的example.com。首先,您将获得无效的证书错误,但是当您向浏览器添加例外时,您会注意到它有效。

答案 2 :(得分:0)

试试这个

RewriteCond %{HTTP_HOST} ^[a-z0-9-]+\.[a-z]+$
RewriteRule !"" https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NC]

而不是

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,NC,L]

答案 3 :(得分:0)

你要做的事是不可能的。如果用户通过SSL访问www.domain.cc,那么如果您没有有效的SSL证书,则会收到证书错误 - 即使您只想将其重定向到正确的站点。

您将需要www.domain.cc的新证书,或说服您的注册商为您提供* .domain.cc的通配符证书,或者具有多个subjectAltName属性的通配证书。见http://www.crsr.net/Notes/Apache-HTTPS-virtual-host.html

或要求SNA http://en.wikipedia.org/wiki/Server_Name_Indication

答案 4 :(得分:0)

首先,您需要一个涵盖www.xxxx.yyyxxxx.yyy的SSL证书。 如果您获得www.xxxx.yyy的证书,则您的提供商可以同时涵盖这两个证书,但如果您获得xxxx.yyy,则仅涵盖.htaccess。仔细阅读他们的条件。

我读过如此多的建议,指出如何通过各种临时意见重定向,结果各不相同,而且大多没有任何正式解释。

当然,这意味着要进入Apache https://xxxx.yyy引用,并按照第一原则进行工作。

重申一下,主要要求是将所有http(s)请求重定向到RewriteEngine On

与往常一样,打开重写引擎:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R]

对于http,即:

https

然而,对https(port = 443)执行相同操作会强制循环,这会导致错误。我们必须将流程限制为仅适用于wwwRewriteCond。我们通过在一行中提供两个RewriteCond %{SERVER_PORT} 443 RewriteCond %{HTTP_HOST} ^www[.].+$ RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R] 语句来实现这一点,这些语句被视为隐式AND:

RewriteRule

[L,R]的末尾,L告诉重写引擎:

  1. RewriteCond =停止遵守该规则。也就是说,如果由于满足条件(R)而执行规则,则在完成时停止,否则转到下一个条件/规则集。
  2. https://xxxx.yyy =向浏览器发出HTTP重定向(默认代码= 302),因此可以采取用户或自动操作来更新书签,以便日后始终使用{{1}}。 LI>