我从 /etc/httpd/conf.d/ 中的 2 个单独的conf 文件加载了 2 个虚拟主机,当我将浏览器指向 vhost1.test.com 时,它会像 vhost2.test.com 一样加载正确的index.html。然而,Web 服务器现在使用第二个虚拟主机作为服务器通配符域进行响应,如果我为 foo.test.com 创建 DNS 条目,则将加载 vhost2 的页面。如果我删除 vhost2 的配置,vhost1 也会发生相同的行为。我的配置中的什么导致最后加载的虚拟服务器成为通配符域?使用此配置,当我将浏览器指向 test.com 并加载通配符时,apache 也会忽略 /var/www/html 的默认文档根目录。如果没有 vhost.conf 加载,/var/www/html 中的文档将按预期加载。
虚拟主机1.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>
虚拟主机2.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>
答案1
来自 apache 文档服务器如何选择正确的基于名称的虚拟主机
IP 和端口组合的默认基于名称的虚拟主机
如果在包含最具体的匹配 IP 地址和端口组合的虚拟主机集中找不到匹配的 ServerName 或 ServerAlias,则将使用第一个列出的匹配虚拟主机。
因此,当您将 DNS 指向不存在的“foo.test.com”时,您的 HTTP 请求包含标头条目host: foo.test.com
,apache 无法将其与您的 VHOST 之一匹配,因此它始终为它找到的第一个包含 VHOST 容器的文件。
由于文件按字母顺序列出,因此第一个文件将是字母顺序列表最低的文件。
因此,事实上,如果您的 VHOST(或更重要的是它们的文件名)是:
- 虚拟主机1
- 虚拟主机2
虚拟主机1如果 apache 无法通过 IP 地址或主机名将请求匹配到特定 VHOST,则始终会提供服务。
是的,当你第一次发现它时,这是相当令人震惊的,这就是为什么 apache 的一些包会定义一个默认的虚拟主机,文件名为000_default_vhost
.
这样,如果请求与您的 VHOST 的主机名或 IP 不匹配,您就可以确保始终为该 VHOST 提供服务。
您应该考虑以这种方式配置您的服务器,其中服务器000_default_vhost
将始终拒绝带有 404 的请求,因为它们显然不适合您的“正确”域。
如果这对于 apache 来说似乎是不合理的行为,请注意 nginx 的行为方式相同。
如果您使用 nginx 并希望阻止处理未定义服务器名称的请求
您还可以定义一个仅删除请求的服务器:
server {
listen 80;
server_name "";
return 444;
}
并将其放入按字母顺序首先出现的文件中,即/etc/nginx/sites-available/000_catchall