在httpd.conf中使用RewriteCond来防止https错误的域名结尾

时间:2016-07-15 17:05:33

标签: mod-rewrite url-rewriting httpd.conf

我的搜索引擎中的域名出现了一个奇怪的问题:

我拥有几个域名,让我们说:

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 的ssl证书(以及 .org )域名,当访问者在搜索引擎中点击这些结果时,他们会收到浏览器警告,表明与网站的连接不安全。 这非常令人困惑,在浏览器警告出现之前,我无法找到将访问者重定向到正确的 .com 域的方法。

你有想法用mod_rewrite条件或任何解决方法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

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

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

如果没有,您可以让合法搜索机器人不要抓取您网站的.net和.org版本。也许只为这些域添加robots.txt文件,如下所述:Stop Google from indexing

答案 1 :(得分:0)

这组重写将客户端使用的任何主机与其使用的uri重定向到https中相同的URL:

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

所有请求http://example.net/something通过这些内容的人都会以https://example.net/something结尾。如果你所有其他的重写都是必要的。

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

正确的重定向方式只能以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>
  • 如果exam​​ple.com中有关于端口80的内容,您只想为该ServerName添加另一个虚拟主机条目,或者只是在上一个虚拟主机中为example.com添加另一个ServerAlias。

然后:

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

通过这种方式,不会出现将example.com以外的任何主机名作为https请求的错误。

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