当我将浏览器指向vhost1.test.com时,我从/etc/httpd/conf.d/中的2个单独的conf文件中加载了2个虚拟主机,它会像vhost2.test.com一样加载正确的index.html。但是,Web服务器现在以第2个vhost作为服务器通配符域进行响应,如果我为foo.test.com输入dns条目,则将加载vhost2的页面。如果删除vhost2的配置,则现在vhost1也会发生相同的行为。我的配置中有什么导致最后加载的虚拟服务器成为通配符域?通过这种配置,当我将浏览器指向test.com而不是加载通配符时,apache还将忽略/ var / www / html的默认文档根目录。没有任何一个vhost.conf,按预期方式将文件加载到/ var / www / html中。
vhost1.conf
<VirtualHost *:80>
DocumentRoot /vhost1
ServerName vhost1.test.com
ErrorLog logs/vhost1-error_log
CustomLog logs/vhost1-access_log common
<Directory "/vhost1">
order deny,allow
Require all granted
Allow from localhost 127.0.0.1 192.168.
</Directory>
vhost2.conf
<VirtualHost *:80>
DocumentRoot /vhost2
ServerName vhost2.test.com
ErrorLog logs/vhost2-error_log
CustomLog logs/vhost2-access_log common
<Directory "/vhost2">
order deny,allow
Require all granted
Allow from localhost 127.0.0.1 192.168.
</Directory>
从有关服务器如何选择基于名称的适当虚拟主机的apache文档中
IP和端口组合的默认基于名称的虚拟主机
如果在包含最特定的匹配IP地址和端口组合的虚拟主机集合中未找到匹配的ServerName或ServerAlias,则将使用将与之匹配的第一个列出的虚拟主机。
因此,当您将DNS指向不存在的“ foo.test.com”时,HTTP请求中包含标头条目host: foo.test.com
,apache不能将其与您的VHOSTS匹配,因此,它始终会提供它找到的第一个包含VHOST容器的文件。
由于文件是按字母顺序列出的,因此第一个文件将是按字母顺序列出的顺序最少的文件。
因此,实际上,如果您的VHOST-或更重要的是,它们的文件名是:
如果apache无法通过IP地址或主机名将请求与特定的VHOST匹配,则将始终为vhost1提供服务。
是的,当您首次发现它时,这非常令人震惊,这就是为什么某些apache软件包将定义文件名为的默认虚拟主机的原因000_default_vhost
。
这样,您可以确保如果请求与按主机名或IP匹配的VHOST不匹配,则将始终提供此VHOST。
您应该考虑以这种方式配置服务器,该服务器000_default_vhost
将始终拒绝带有404的请求,因为它们显然不适合您的“适当”域。
如果这对于Apache而言似乎是不合理的行为,请注意,nginx的行为方式相同。
如果您使用的是nginx并希望防止使用未定义的服务器名称处理请求
您还可以定义仅丢弃请求的服务器:
server {
listen 80;
server_name "";
return 444;
}
并将其放入按字母顺序第一个出现的文件,即 /etc/nginx/sites-available/000_catchall
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句