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

.htaccess 如何重定向https://www.example.com 到https://example.com,.htaccess,mod-rewrite,ssl,redirect,.htaccess,Mod Rewrite,Ssl,Redirect,我环顾四周,似乎找不到一个明确的解决办法。我们遇到了一个小问题,一些或我们的访问者正在我们的域中键入以下内容: https://www.example.com-这是一个安全警告“此网站的安全证书有问题。” 我们为example.com 所以如果有人输入http://www.example.com或www.example.com这会被重定向到https://example.com这可以正常工作 这是我当前在.htaccess文件中拥有的内容: Options +FollowSymLinks Re

我环顾四周,似乎找不到一个明确的解决办法。我们遇到了一个小问题,一些或我们的访问者正在我们的域中键入以下内容:

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

我们为
example.com

所以如果有人输入
http://www.example.com
www.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]
试试这个

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]
编辑:


大多数SSL证书都是为特定主机名颁发的,例如
www.example.com
或只是
example.com
(也可以为
*.example.com
颁发通配符证书),因此可能是这样

可能在最后一次
RewriteCond
中将www.子域作为可选匹配项有助于用户访问证书中声明的域:

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

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

您尝试执行的操作是不可能的。如果用户通过SSL访问www.domain.cc,那么如果您没有有效的SSL证书,您将收到一个证书错误-即使您只想将它们重定向到正确的站点

您需要www.domain.cc的新证书,或者说服您的注册官为*.domain.cc提供通配符证书,或者提供具有多个subjectAltName属性的证书。看


或者要求SNA

首先,您需要一个SSL证书,该证书涵盖
www.xxxx.yyy
xxxx.yyy
。 如果您获得了
www.xxxx.yyy
的证书,您的提供商可能会涵盖这两个方面,但如果您获得了
xxxx.yyy
,则仅限于此。仔细阅读他们的情况

我读过很多关于如何重新定向的建议,各种各样的特别意见,结果各异,而且大多没有任何正式的解释

当然,这意味着进入Apache
.htaccess
参考,从第一原则开始工作是正确的

重申一下,主要要求是将所有http(s)请求重定向到
https://xxxx.yyy

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

RewriteEngine On
对于http,即:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R]
但是,对https(端口=443)执行相同的操作将强制执行循环,这将导致一个错误。我们必须将该过程限制为仅对
https
www
工作。为此,我们在一行中提供了两个
RewriteCond
语句,它们被视为隐式和:

RewriteCond %{SERVER_PORT} 443
RewriteCond %{HTTP_HOST} ^www[.].+$
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R]
重写规则
的末尾,
[L,R]
告诉重写引擎:

  • L
    =按该规则停止。也就是说,如果规则是因为其条件(
    RewriteCond
    )得到满足而执行的,则在完成时停止,否则转到下一个条件/规则集
  • R
    =向浏览器发出HTTP重定向(默认代码=302),这样可以采取用户或自动操作来更新书签,使书签始终使用
    https://xxxx.yyy
    以后

  • 放置-1的人也能解释自己吗?@Eugene我刚才试过这个,但仍然得到同样的警告。感谢您的快速响应SSL是否仅保护domain.com而不是www.domain.com?大多数SSL证书都是针对特定主机名颁发的,例如www.domain.com或just domain.com(也可以为*.domain.com颁发通配符证书)所以可能是这样的。我希望不是这样的,并且会有一个解决办法。您是否尝试过用这一行替换最后一行
    RewriteCond
    RewriteCond%{HTTP_HOST}^(?:www\.)?(.*)[NC]
    @JCoder感谢您的回复。我现在将实现它,并让您知道发生了什么。@JCoder。只是尝试了一下,但没有成功。谢谢你的帮助。我建议你在下面发表评论,回答这个问题,我会同意的。谢谢但你说它没用?!显然,我很慢,因为我似乎是唯一一个看不清问题是什么的人。对,这个把戏不起作用。我指的是你早些时候的评论。在尤金邮报下面。“大多数SSL证书是针对特定主机名颁发的…”很抱歉造成混淆。除了编辑我的答案,我还在自己的服务器上尝试了更改,看起来www.已被删除。