我有几个站点配置为VirtualHost。它们都运行在同一系统,相同的IP地址上。我希望apache基于DNS将请求重定向到一个或另一个VirtualHost。这就是我使用ServerName的原因。引用:
如果您使用的是基于名称的虚拟主机,则其中的ServerName section指定必须在主机名中显示的主机名 请求的主机:标头以匹配此虚拟主机。
这就是我的虚拟主机配置的样子:
NameVirtualHost *:80
<VirtualHost *>
ServerName my.dns.net
....
</VirtualHost>
但是apache,而不是根据DNS加工请求,只是将请求重定向到定义的第一个VirtualHost。
答案 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,并会在回到默认(第一个)之前尝试每个虚拟主机。