以下指令告诉 apache 您将使用基于名称的虚拟主机。
NameVirtualHost *:80
如果您查看 apache 文档中的示例:
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 -> apache modules -> httpd.conf -> ports.conf -> /etc/apache2/conf.d/ 中存在的任何 .conf 文件 -> 最后(按字母顺序)您的 VirtualHosts conf 文件。
在您的代码中,您已经在 VirtualHost conf 文件中定义了指令,但在此之前您可能有其他 VirtualHost。因此,当 Apache 按字母顺序读取 VirtualHosts confs 文件时,它可能会在解析“NameVirtualHost *:80”指令之前读取另一个 VirtualHosts conf 文件,因此它不会读取以下 VirtualHosts conf 文件。
解决方案是在 virtualhosts conf 文件之前的任何位置定义该指令。我认为(尽管我不是 100% 确定)在 Ubuntu Server 中,标准方法是在 /etc/apache2/ports.conf 中定义该行,如前所述,在 /etc/apache2/sites 中的所有虚拟主机之前读取该行-可用。因此,Apache 会知道您有 ServerNames,并会在回退到默认(第一个)之前尝试每个虚拟主机。