Apache IP 和基于名称的虚拟主机

Apache IP 和基于名称的虚拟主机

我对 apache 并不陌生,但是我对此很困惑。

我无法在特定 IP 上启动第二个 VirtualHost。它似乎只是使用该 IP 的默认 VirtualHost。

我有一台拥有两个 IP 地址的服务器。它在两个 IP 上的端口 80 和 443 上运行,因此我有四个 NameVirtualHosts,例如

NameVirtualHost 1.1.1.1:80
NameVirtualHost 1.1.1.1:443
NameVirtualHost 2.2.2.2:80
NameVirtualHost 2.2.2.2:443

现在我有一个默认的(即文件命名,以便在下一个文件之前获取)VirtualHost 为 2.2.2.2:80 定义为

<VirtualHost 2.2.2.2:80>
    ServerAdmin [email protected]
    CustomLog /var/log/apache2/ip2-80-access.log combined 
    ErrorLog /var/log/apache2/ip2-80-error.log
</VirtualHost>

还有第二个

<VirtualHost 2.2.2.2:80>
    ServerAdmin [email protected]
    ServerName foo.example.com
    DocumentRoot /var/www/foo.example.com
    CustomLog /var/log/apache2/ip2-80-access.log combined 
    ErrorLog /var/log/apache2/ip2-80-error.log
</VirtualHost>

DNS 已设置,以便foo.example.com指向2.2.2.2

但当我尝试访问时,foo.example.com/anything出现 404 未找到。看来 apache 忽略了我的第二个基于名称和基于 ip 的虚拟主机。

我在 Debian 6 (Squeeze) 上使用 Apache 2.2。请注意:我不是尝试让 apache 在这里为 SSL 选择一个虚拟主机(我知道限制/SNI 等),这是标准端口 80。

答案1

用于apache2ctl -S列出虚拟主机和默认值。

这表明 apache 正在选择默认此 IP:Port 的 VirtualHost 与指定主机名的 VirtualHost 相同:

VirtualHost configuration:
2.2.2.2:80     is a NameVirtualHost
         default server foo.example.org.uk (/etc/apache2/sites-enabled/2.2.2.2:1)
         port 80 namevhost foo.example.org.uk (/etc/apache2/sites-enabled/2.2.2.2:1)
         port 80 namevhost foo.example.org.uk (/etc/apache2/sites-enabled/2.2.2.2:18)
2.2.2.2:443    is a NameVirtualHost
         ...
1.1.1.1:80     is a NameVirtualHost
         ...etc...

即我曾认为,因为我提供了一个与VirtualHost'sServerName指令匹配的主机名,并且不是默认情况下提供ServerName,将选择第二个。

然而,Apache 似乎使用 2.2.2.2 的主机名/etc/hosts作为任何该 IP 上的请求。在我看来,这有点不透明。

因此,有两种方法可以使其工作:

  1. 将主机名更改/etc/hostsfoo2.example.org.uk。重新启动 Apache,现在请求foo.example.org.uk/something工作。当然,这确实是概念验证,您可能希望您的服务器名称与主服务器名称匹配。

  2. 添加ServerName指令第一的 VirtualHost。可以是任何东西,例如goaway.local。这意味着正确的域名上的请求由正确的VirtualHost块提供服务,其他任何东西(例如所有那些烦人的直接 IP 漏洞探测)都由默认处理,可以设置为拒绝一切。

相关内容