我在 Apache Web 服务器 (CentOS 5,Apache 2.2.3) 上有多个命名的虚拟主机。
每个虚拟主机都有自己的配置文件/etc/httpd/vhosts.d
,这些虚拟主机配置文件包含在主 httpd conf 中...Include vhosts.d/*.conf
这是 vhost 配置之一的示例...
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 地址直接访问服务器时,他们都会获得聚合配置中指定的第一个虚拟主机(因此在我的情况下,它是按vhosts.d
目录中的字母顺序排列的)。任何通过 IP 地址直接访问服务器的人,我希望他们只得到 403 或 404。
我发现了几种设置默认/全部捕获虚拟主机的方法以及一些相互矛盾的观点。
我可以在 vhosts.d 中创建一个名为 000aaadefault.conf 或类似的新 vhost conf,但感觉有点讨厌。
在包含目录之前我可以
<VirtualHost>
在主目录中有一个块。httpd.conf
vhosts.d
我可以
DocumentRoot
在主文件中指定一个httpd.conf
httpd.conf
那么如何使用_default_
http://httpd.apache.org/docs/2.2/vhosts/examples.html#default<VirtualHost _default_:*>
在我httpd.conf
之前 设置一个块Include vhosts.d/*.conf
是解决所有问题的最佳方法吗?
答案1
设置<VirtualHost _default_:*>
不会产生任何效果,它不会优先于配置为的虚拟主机<VirtualHost *:80>
(80 以外的端口除外)。
_default_
仅应与基于 IP 的虚拟主机一起使用。从文档:
默认虚拟主机从不提供发送到基于名称的虚拟主机使用的地址/端口的请求。
如果觉得滥用字母顺序来设置默认值很不妥,那么是否可以将基于名称的默认虚拟主机放在主文件中的行httpd.conf
前Include
?
答案2
我可以在 vhosts.d 中创建一个名为 000aaadefault.conf 或类似的新 vhost conf,但感觉有点讨厌。
但这实际上是最好的方法。您希望与配置保持一致,因此不要将一个<VirtualHost>
块放在 httpd.conf 中,而将其余块放在单独的文件中。将配置文件命名为默认 vhost !default.conf
,然后确保没有其他vhosts.d
名称以标点符号开头的 conf 文件。