我用我的Apache安装程序有一个非常奇怪的行为,然后修复它,但是我想了解真正发生了什么。 我的httpd.conf看起来像这样:
<VirtualHost *:80> ServerName mysite.com ServerAlias www.mysite.com ... <Directory "/path/to/mysite.com"> </Directory> </VirtualHost>
===那么,我想添加第二个不同的主机,具有相同的IP,但不同的域名,所以我添加了以下文件后(上述行)
<VirtualHost adifferentdomain.com:80> ServerName adifferentdomain.com ServerAlias www.adifferentdomain.com ... <Directory "/path/to/adifferentdomain.com"> </Directory> </VirtualHost>
======最终结果:当您浏览mysite.com时,您会看到来自adifferentdomain.com的内容。 当您浏览adifferentdomain.com时,您会看到adifferentdomain.com
那到底发生了什么? 那是标准的redirect吗? 或者从普通浏览器的“理解”到底是什么?
我的问题是因为这影响了我的谷歌排名戏剧性,我想知道谷歌看到了什么。
发生这种情况是因为当Apache启动并读取此文件时,它parsing了adifferentdomain.com的IP,并且由于该块位于*虚拟主机之前,因此来自该IP的所有请求都由该虚拟主机configuration提供服务。 实际上没有redirect。 Apache确定该虚拟主机块是适当的服务器来处理该IP上的任何请求。
在VirtualHost指令中接受主机名仅仅是IP可能改变的情况的一种方便,或者当你有一个由一个Apache实例提供不同IP的域/主机的数量时,你的configuration看起来更具可读性。
正如你无疑发现的那样,ServerName和ServerAlias组件提供了适当的魔术(但只对执行HTTP / 1.1请求的客户端提供他们试图从请求头中请求的主机名)。
更新
回应你的评论:如果你想用你描述的方式来复制这个问题(2个主机使用基于名字的虚拟主机正确的地方,你不需要),你需要正确定义域1的虚拟主机(具有相应的NameVirtualHost指令)和domain3,首先使用domain3 vhost指令。 假设这个apache实例提供的所有域都被关联到同一个IP:
#让Apache知道你知道你想做基于名称 #这个IP /端口对上匹配的虚拟主机 NameVirtualHost *:80 <VirtualHost *:80> ServerName domain3.com ServerAlias www.domain3.com ... </虚拟主机> <VirtualHost *:80> ServerName domain1.com ServerAlias www.domain1.com ... </虚拟主机>
重要的是,你想成为默认的虚拟主机是第一位的,共享你想要执行基于名称的虚拟主机匹配的虚拟主机有一个NameVirtualHost线,并使用相同的IP /端口组合。 如果您不使用NameVirtualHost行,Apache将默认find第一个find的最佳匹配(指定IP beats *,如您之前所发现的那样)。