你能解释一下这个Apache安装的结果吗?

我用我的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 *,如您之前所发现的那样)。