0

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

如果您使用基于名称的虚拟主机,则部分内的 ServerName 指定必须出现在请求的 Host: 标头中的主机名以匹配此虚拟主机。

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

NameVirtualHost *:80
<VirtualHost *>

    ServerName my.dns.net

    ....

</VirtualHost>

但是 apache 并没有按照 DNS 处理请求,而是将请求重定向到定义的第一个 VirtualHost。

  • 这是为什么?
  • 我能做些什么来强制 apache 进行精确的 DNS 匹配?
4

1 回答 1

2

以下指令告诉 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,并会在回退到默认(第一个)之前尝试每个虚拟主机。

于 2013-05-23T07:36:32.713 回答