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

我不是新来的阿帕奇,但我拉我的头发在这一个。

我无法在特定的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 for 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没有find。 看来apache忽略了我的第二个基于名字和基于ip的虚拟主机

我在Debian 6(Squeeze)上使用Apache 2.2。 请注意:我不想让Apache在这里selectSSL的虚拟主机(我知道限制/ SNI等),这是标准的端口80。

使用apache2ctl -S列出虚拟主机和默认设置。

这表明apache正在为这个IP:Portselect默认的 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... 

即我曾经想过,因为我提供了一个与VirtualHostServerName指令相匹配的主机名,并且没有在默认情况下提供一个ServerName ,所以第二个将被select。

但是,Apache似乎要使用/etc/hosts 2.2.2.2的主机名作为该IP上任何请求的主机名。 这是一个不透明的国际海事组织。

所以有两种方法可以使它工作:

  1. /etc/hosts的主机名更改为foo2.example.org.uk 。 重新启动Apache,现在请求foo.example.org.uk/something工作。 当然,这是真正的概念certificate,您可能希望您的服务器名称与主服务器名称匹配。

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