为什么所有不匹配的流量都转到第一个VirtualHost而不是httpd.conf中的默认站点配置

时间:2015-08-21 11:54:06

标签: linux apache centos virtualhost httpd.conf

我一直想知道为什么所有不匹配的流量都转到第一个VirtualHost而不是httpd.conf中的默认站点配置?

让我们假设httpd.conf尚未编辑。

我创建了一个名为/etc/httpd/conf.d/vhost.conf

的文件

以下内容:

<VirtualHost *:80>
        ServerName website.com
        ServerAlias www.website.com
        DocumentRoot "/site1"
        <Directory "/site1">
                AllowOverride All
                Require all granted
        </Directory>

        Some Rules Here
</VirtualHost>
<VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com
        DocumentRoot "/site2"
        <Directory "/site2">
                AllowOverride All
                Require all granted
        </Directory>

        Some Rules Here
</VirtualHost>

以上示例,如果您发送stackoverflow.com请求,您将被过滤到第一个vhost,无论过滤器是什么,而不是httpd.conf中的默认网站

我错过了什么?

1 个答案:

答案 0 :(得分:3)

你没有做错任何事;这就是Apache Name-based Virtual Hosts的工作原理:

在Apache上配置虚拟主机后,即原始默认Web服务器 (如果有的话)成为另一个虚拟主机;这个没什么特别的 在httpd.conf中配置的Web服务器。默认虚拟主机(对于Apache“侦听”的IP地址)只是Apache配置文件中列出的第一个

  

如果要将虚拟主机添加到现有Web服务器,还必须为现有主机创建<VirtualHost>块。此虚拟主机中包含的ServerNameDocumentRoot应与全局ServerNameDocumentRoot相同。首先在配置文件中列出此虚拟主机,以便它将充当默认主机。

另外,从同一页面:

  

如果未找到匹配的虚拟主机,则将使用与该IP地址匹配的第一个列出的虚拟主机

     

因此,第一个列出的虚拟主机是默认虚拟主机。当IP地址与DocumentRoot指令匹配时,主服务器的NameVirtualHost永远不会。如果您希望对与任何特定虚拟主机不匹配的请求进行特殊配置,只需将该配置放在<VirtualHost>容器中,然后将其列在配置文件中。

我发现的虚拟主机如何在Apache上工作的最佳整体描述是An In-Depth Discussion of Virtual Host Matching。这也指明了,

  

给定IP:端口对的配置文件中第一个基于名称的vhost很重要,因为它用于在该地址和端口上收到的所有请求,对于该IP:端口对没有其他vhost具有匹配的{ {1}}或ServerName。如果服务器不支持服务器名称指示,它也用于所有SSL连接。

     

具有指定IP地址的配置文件中的第一个vhost具有最高优先级,并捕获对未知服务器名称的任何请求,或者没有Host:头字段的请求(例如HTTP / 1.0请求)。