我一直在想,为什么所有不匹配的流量都流向第一个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中的默认站点。
我遗漏了什么?
发布于 2015-08-21 12:13:05
您没有做错任何事情;这就是Apache的基于名称的虚拟主机的工作方式:
在Apache上配置虚拟主机之后,原始的默认web服务器(如果有的话)变成了另一个虚拟主机;在httpd.conf中配置的web服务器没有什么特别之处。默认的虚拟主机(对于Apache“侦听”的IP地址)只是Apache文件中列出的第一个主机:
如果要向现有web服务器添加虚拟主机,还必须为现有主机创建一个
<VirtualHost>块。这个虚拟主机中包含的ServerName和DocumentRoot应该与全局ServerName和DocumentRoot相同。首先在配置文件中列出此虚拟主机,以便它充当默认主机。
此外,从同一页:
如果没有找到匹配的虚拟主机,那么将使用首先列出的与IP地址匹配的虚拟主机。 因此,第一个列出的虚拟主机是默认的虚拟主机。当IP地址与
DocumentRoot指令匹配时,来自主服务器的永远不会使用NameVirtualHost。如果您希望对不匹配任何特定虚拟主机的请求进行特殊配置,只需将该配置放在一个<VirtualHost>容器中,并将其列在配置文件中。
关于虚拟主机如何在Apache上工作的最好的总体描述是虚拟主机匹配的深入探讨。这还规定,
给定IP:端口对的配置文件中的第一个基于名称的vhost非常重要,因为它用于在该地址和端口上接收到的所有请求,而该IP:端口对的其他vhost没有匹配的
ServerName或ServerAlias。如果服务器不支持服务器名称指示,则它也用于所有SSL连接。 配置文件中具有指定IP地址的第一个vhost具有最高的优先级,并且捕捉到指向未知服务器名称的任何请求,或者没有header字段的请求(例如HTTP/1.0请求)。
https://stackoverflow.com/questions/32139668
复制相似问题