按字母顺序排列的Apache2默认虚拟主机,或用_default_虚拟主机覆盖?

我在Apache Web服务器上有多个命名的虚拟主机(CentOS 5,Apache 2.2.3)。
每个虚拟主机在/etc/httpd/vhosts.d都有自己的configuration文件,这些虚拟主机configuration文件包含在主httpd conf中, Include vhosts.d/*.conf

这里有一个虚拟主机的例子

 NameVirtualHost *:80 <VirtualHost *:80> ServerName www.domain.biz ServerAlias domain.biz www.domain.biz DocumentRoot /var/www/www.domain.biz <Directory /var/www/www.domain.biz> Options +FollowSymLinks Order Allow,Deny Allow from all </Directory> CustomLog /var/log/httpd/www.domain.biz_access.log combined ErrorLog /var/log/httpd/www.domain.biz_error.log </VirtualHost> 

现在,当任何人试图直接通过公共IP地址访问服务器时,他们会得到在聚合configuration中指定的第一个虚拟主机(所以在我的情况下,它是从vhosts.d目录的字母顺序)。 任何人通过IP地址直接访问服务器,我想他们只是得到一个403或404。

我发现了几种设置默认/全部虚拟主机和一些相互矛盾的观点的方法。

  • 我可以在vhosts.d中创build一个叫做000aaadefault.conf的新的虚拟主机configuration文件,但是这有点令人讨厌。

  • 在包含vhosts.d目录之前,我可以在主httpd.conf有一个<VirtualHost>块。

  • 我可以在我的主httpd.conf指定一个DocumentRoot

那么在httpd.conf中用_default_ http://httpd.apache.org/docs/2.2/vhosts/examples.html#default指定默认虚拟主机
Include vhosts.d/*.conf之前,在我的httpd.conf有一个<VirtualHost _default_:*>块是否是最好的方式?

设置一个<VirtualHost _default_:*>将不会做任何事情,它不会优先于configuration为<VirtualHost *:80>虚拟主机( <VirtualHost *:80>以外的端口除外)。

_default_只能用于基于IP的虚拟主机。 从文档 :

默认虚拟主机从不提供发送到用于基于名称的虚拟主机的地址/端口的请求。

如果滥用alphabetization来设置默认的感觉很脏,也许把默认的基于名称的虚拟主机在你的主要httpd.conf ,在Include行之前?

我可以在vhosts.d中创build一个叫做000aaadefault.conf的新的虚拟主机configuration文件,但是这有点令人讨厌。

不过,这实际上是最好的办法。 你想和你的configuration一致,所以不要把一个<VirtualHost>块放在httpd.conf中,其余的放在不同的文件中。 将缺省vhost的configuration文件命名为!default.conf ,然后确保vhosts.d中没有其他configuration文件,名称以标点符号开头。