您能解释一下这个 Apache 设置的结果吗?

您能解释一下这个 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

那么究竟发生了什么?这是标准重定向吗?或者常规浏览器的“理解”到底是什么?

我的问题是,这极大地影响了我的谷歌排名,我想知道谷歌到底看到了什么。

答案1

发生这种情况的原因是,当 Apache 启动并读取此文件时,它解析了 adifferentdomain.com 的 IP,并且由于该块位于 * 虚拟主机之前,因此该 IP 上的所有请求都由该虚拟主机配置提供服务。因此,实际上没有发生重定向。Apache 确定该虚拟主机块是适合为该 IP 上的任何请求提供服务的块。

在 VirtualHost 指令中接受主机名仅仅是为了方便 IP 可能改变的情况/当您拥有多个由一个 Apache 实例提供服务且具有不同 IP 的域/主机时,您希望您的配置看起来更具可读性。

您无疑会发现,ServerName 和 ServerAlias 组件为此提供了适当的魔力(但仅限于执行 HTTP/1.1 请求并在请求标头中提供他们尝试请求的主机名的客户端)。


更新

回应您的评论:如果您想以您描述的方式复制此问题(2 个主机正确使用基于名称的虚拟主机,而其中一个没有),您需要正确定义域 1 和域 3 的虚拟主机(使用相应的 NameVirtualHost 指令),其中域 3 虚拟主机指令在前。假设此 apache 实例提供的所有域都由同一 IP 提供服务:

# 让 Apache 知道你想要基于名称
# 此 IP/端口对上的虚拟主机匹配
名称虚拟主机 *:80

<虚拟主机 *:80>
  服务器名称 domain3.com
  服务器别名 www.domain3.com
  ...
</虚拟主机>

<虚拟主机 *:80>
  服务器名称 domain1.com
  服务器别名 www.domain1.com
  ...
</虚拟主机>

重要的是,您希望默认的虚拟主机要放在第一位,并且共享您希望执行基于名称的虚拟主机匹配的 IP 的虚拟主机有一行NameVirtualHost并使用相同的 IP/端口组合。如果您不使用该NameVirtualHost行,Apache 将默认使用第一个找到的最佳匹配(指定的 IP 胜过您之前发现的 *)。

相关内容