我一直想知道为什么所有不匹配的流量都转到第一个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中的默认网站
我错过了什么?
答案 0 :(得分:3)
你没有做错任何事;这就是Apache Name-based Virtual Hosts的工作原理:
在Apache上配置虚拟主机后,即原始默认Web服务器
(如果有的话)成为另一个虚拟主机;这个没什么特别的
在httpd.conf
中配置的Web服务器。默认虚拟主机(对于Apache“侦听”的IP地址)只是Apache配置文件中列出的第一个:
如果要将虚拟主机添加到现有Web服务器,还必须为现有主机创建
<VirtualHost>
块。此虚拟主机中包含的ServerName
和DocumentRoot
应与全局ServerName
和DocumentRoot
相同。首先在配置文件中列出此虚拟主机,以便它将充当默认主机。
另外,从同一页面:
如果未找到匹配的虚拟主机,则将使用与该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请求)。