Apache2 默认 vhost 按字母顺序排列还是用 _default_ vhost 覆盖?

Apache2 默认 vhost 按字母顺序排列还是用 _default_ vhost 覆盖?

我在 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.confvhosts.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.confInclude

答案2

我可以在 vhosts.d 中创建一个名为 000aaadefault.conf 或类似的新 vhost conf,但感觉有点讨厌。

但这实际上是最好的方法。您希望与配置保持一致,因此不要将一个<VirtualHost>块放在 httpd.conf 中,而将其余块放在单独的文件中。将配置文件命名为默认 vhost !default.conf,然后确保没有其他vhosts.d名称以标点符号开头的 conf 文件。

相关内容