mod rewrite - 在 httpd.conf 中重写Cond 以防止 https 域名后缀错误



我在搜索引擎中的域名有一个奇怪的问题:

我拥有多个域名,假设:

example.com
example.net
example.org

所有域都指向我的服务器,这就是为什么我在 httpd.conf 文件顶部添加重定向以防止重复内容:

RewriteCond %{HTTP_HOST} !^example.com$
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

它对用户来说效果很好。

由于我获得了.com域的 ssl-证书,因此我将所有用户重定向到 https 版本:

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}

对用户来说也很好。

现在奇怪的问题是:出于某种原因,有时搜索引擎会列出 https://example.net/apage.php 并且由于我没有获得.net(和.org)域的SSL证书,当访问者在搜索引擎中单击这些结果时,他们将收到浏览器警告与网站的连接不安全。这非常令人困惑,在浏览器警告出现之前,我找不到将访问者重定向到正确的.com域的方法。

您是否有使用mod_rewrite条件或任何解决方法解决此问题的想法?

mod_rewrite通过向浏览器发送重定向来工作,因此它必须首先到达服务器。浏览器显示的警告发生在这之前。

也许您可以购买多域SSL证书。

如果没有,您可以让合法的搜索机器人不抓取您网站的 .net 和 .org 版本。也许通过仅为这些域包含robots.txt文件,如下所示: 阻止谷歌编入索引

组重写会将客户端使用的任何主机重定向到https中的同一URL:

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}

因此,任何要求 http://example.net/something 通过这些的人最终都会被 https://example.net/something。如果所有您的其他重写集都是必要的。

在任何情况下,使用mod_rewrite进行这种简单的重定向只会使事情变得不必要地复杂化,并且检查HTTPS是否在非SSL虚拟主机中关闭是多余的。

重定向到仅在https中以 example.com 结尾的正确方法:

NamedVirtualHost *:80 <-- use this for more vh's present and if this is 2.2.x
<VirtualHost *:80>
ServerName example.net
ServerAlias example.org
Redirect / https://example.com/
</VirtualHost>
  • 如果 example.com 中有您要提供的端口 80 的内容,您只需为该 ServerName 添加另一个虚拟主机条目,或者只需为上一个虚拟主机中的 example.com 添加另一个 ServerAlias。

然后:

<VirtualHost *:443>
ServerName example.com
#.....other directives here
</VirtualHost>

这样就不会犯任何错误,将除 example.com 以外的任何主机名作为https请求。

所有这些都不需要不必要的复杂重写。

最新更新