我对 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 上的请求。在我看来,这有点不透明。
因此,有两种方法可以使其工作:
将主机名更改
/etc/hosts
为foo2.example.org.uk
。重新启动 Apache,现在请求foo.example.org.uk/something
工作。当然,这确实是概念验证,您可能希望您的服务器名称与主服务器名称匹配。添加
ServerName
指令第一的VirtualHost
。可以是任何东西,例如goaway.local
。这意味着正确的域名上的请求由正确的VirtualHost
块提供服务,其他任何东西(例如所有那些烦人的直接 IP 漏洞探测)都由默认处理,可以设置为拒绝一切。