我有两个域名 - oliverhaslam.com 和 ojhaslam.co.uk。
两者都在同一家公司注册,并且都有指向我的服务器 IP 地址的 A 记录。
两者还具有将 www 地址指向等效的非 www 地址的 CNAME 记录(将 www.oliverhaslam.com 指向 oliverhaslam.com 等)
问题是:虽然 www.oliverhaslam.com 重定向到 oliverhaslam.com 并在浏览器的地址栏中显示,但 www.ojhaslam.co.uk 定向到正确的 IP,但没有定向到 ojhaslam.co.uk。
将 www.ojhaslam.co.uk 的服务器别名添加到我的虚拟主机后,内容可以在浏览器中正确显示,但地址栏不会反映到 ojhaslam.co.uk 的重定向。正如我所说,这不是我在 oliverhaslam.com 上看到的行为,我担心 SEO 等会将 www.ojhaslam.co.uk 和 ojhaslam.co.uk 视为两个独立的网站。
这是我的 httpd.conf 文件:
<VirtualHost *:80>
ServerName oliverhaslam.com
ServerAlias oliverhaslam.com
DocumentRoot /var/www/
</VirtualHost>
<VirtualHost *:80>
ServerName ojhaslam.co.uk
ServerAlias ojhaslam.co.uk
DocumentRoot /var/www/photo365/
</VirtualHost>
有什么想法为什么两个域名在注册商处配置相同,并在 httpd.conf 中配置相同,但行为却不同?
谢谢。
编辑:
现在我通过将上面的代码更改为以下内容来实现这一点:
<VirtualHost *:80>
ServerName oliverhaslam.com
ServerAlias oliverhaslam.com
DocumentRoot /var/www/
</VirtualHost>
<VirtualHost *:80>
ServerName ojhaslam.co.uk
ServerAlias ojhaslam.co.uk
#RedirectMatch permanent /(.*) http://ojhaslam.co.uk/$1
DocumentRoot /var/www/photo365/
</VirtualHost>
<VirtualHost *:80>
ServerName www.ojhaslam.co.uk
ServerAlias www.ojhaslam.co.uk
RedirectMatch permanent /(.*) http://ojhaslam.co.uk/$1
DocumentRoot /var/www/photo365/
</VirtualHost>
但问题仍然存在——为什么它对一个域有效,而对另一个域无效?
答案1
CNAME 记录的目的不是重定向,而是模仿另一个记录。
您需要告诉客户端进行重定向。这可以通过以下任一方式实现:
1)为www.
名称创建新的虚拟主机,并使用Redirect
指令,如下所示:
<VirtualHost *:80>
ServerName www.ojhaslam.co.uk
...
Redirect ojhaslam.co.uk
</VirtualHost>
2)使用mod_rewrite
:
<VirtualHost *:80>
ServerName ojhaslam.co.uk
ServerAlias www.ojhaslam.co.uk
...
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
</VirtualHost>
答案2
您的配置中的别名根本没有用处:
ServerName oliverhaslam.com
ServerAlias oliverhaslam.com
您正在为主服务器名称设置别名。这就像说:“嗨,我叫奥利弗。但你可以叫我奥利弗”。这是重复的,因此没有必要。出于 SEO 目的,只需将您的 www 域名重写为非 www 等效域名,使用以下行:
# Redirect www to non-www (SEO optimization)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.oliverhaslam\.com$ [NC]
RewriteRule ^/(.*)$ http://oliverhaslam.com/$1 [L,R=301]
对于您的辅助域名:
# Redirect www to non-www (SEO optimization)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.ojhaslam\.co\.uk$ [NC]
RewriteRule ^/(.*)$ http://ojhaslam.co.uk/$1 [L,R=301]
这应该可以处理所有正确的重定向(使用 301 重定向)。
答案3
关于如何修复此问题,您已经有足够多的回复了httpd.conf
,因此我不再讨论这个问题。
问题是,为什么它一开始就起作用了。
当您访问 时发生了什么www.oliverhaslam.com
?您的 DNS 服务器进入其记录,发现它是 的 CNAME,oliverhaslam.com
并为您的浏览器提供了 的 A 记录oliverhaslam.com
,类似于1.2.3.4
。
好的,我们暂时先不讨论这个案例,稍后再讨论。现在www.ojhaslam.co.uk
。出现了相同的场景,DNS 服务器最终也返回了正确的 IP,即1.2.3.4
。
然后请求到达 IP 并1.2.3.4
进入 Apache。Apache 在其 IP 之一上收到请求,发现它是一个基于名称的虚拟主机,并尝试查找匹配的VirtualHost
在您的配置中找到匹配的 -block。该死的,它找不到它!没有匹配的万维网.oliverhaslam.com,也不万维网.ojhaslam.co.uk。那么它做什么呢?它会默认虚拟主机。根据文档:
现在,当请求到达时,服务器将首先检查它是否正在使用与 NameVirtualHost 匹配的 IP 地址。如果是,那么它将查看具有匹配 IP 地址的每个部分,并尝试找到 ServerName 或 ServerAlias 与请求的主机名匹配的部分。如果找到一个,那么它将使用该服务器的配置。如果未找到匹配的虚拟主机,那么首次上市 将使用与 IP 地址匹配的虚拟主机。
这就是您的解释。两个 www 站点均由第一个 VirtualHost 块提供服务,即oliverhaslam.com
。