为什么ServerName没有任何影响?

时间:2013-05-22 17:36:03

标签: apache virtualhost

我有几个站点配置为VirtualHost。它们都运行在同一系统,相同的IP地址上。我希望apache基于DNS将请求重定向到一个或另一个VirtualHost。这就是我使用ServerName的原因。引用:

  

如果您使用的是基于名称的虚拟主机,则其中的ServerName    section指定必须在主机名中显示的主机名   请求的主机:标头以匹配此虚拟主机。

这就是我的虚拟主机配置的样子:

NameVirtualHost *:80
<VirtualHost *>

    ServerName my.dns.net

    ....

</VirtualHost>

但是apache,而不是根据DNS加工请求,只是将请求重定向到定义的第一个VirtualHost。

  • 为什么?
  • 如何强制apache进行精确的DNS匹配?

1 个答案:

答案 0 :(得分:1)

以下指令告诉apache您将使用基于名称的虚拟主机。

NameVirtualHost *:80

如果你看一下apache docs中的例子:

http://httpd.apache.org/docs/2.2/vhosts/name-based.html

您可以看到它是在VirtualHosts之前定义的。这是有道理的,因为在处理该指令之前,Apache不知道您将使用基于名称的虚拟主机。

了解Apache处理conf文件的顺序非常重要。如果查看apache2.conf,您将看到以下代码:

# Include module configuration:
Include mods-enabled/*.load
Include mods-enabled/*.conf

# Include all the user configurations:
Include httpd.conf

# Include ports listing
Include ports.conf

(...)

# Include generic snippets of statements
Include conf.d/

# Include the virtual host configurations:
Include sites-enabled/

因此,处理顺序为:

apache2.conf - &gt; apache模块 - &gt; httpd.conf - &gt; ports.conf - &gt; /etc/apache2/conf.d/中的任何.conf文件 - &gt;最后(按字母顺序)你的VirtualHosts配置文件。

在您的代码中,您已在VirtualHost配置文件中定义了指令,但在此之前可能还有其他VirtualHost。因此,当Apache以alfabethical顺序读取VirtualHosts confs文件时,它可能会在解析“NameVirtualHost *:80”指令之前读取另一个VirtualHost conf文件,因此它不会读取以下VirtualHosts配置文件。

解决方案是在virtualhosts conf文件之前的任何位置定义该指令。我认为(虽然我不是100%肯定)在Ubuntu Server中,标准方法是在/etc/apache2/ports.conf中定义该行,如前所述,在/ etc / apache2 / sites中的所有虚拟主机之前读取-avalaible。因此,Apache会知道你有ServerNames,并会在回到默认(第一个)之前尝试每个虚拟主机。