我在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文件,名称以标点符号开头。