默认虚拟主机是配置文件中第一个满足监听条件(如*:80)且无匹配servername的virtualhost块;它按从上到下顺序生效,用于处理未匹配域名的请求,并需置于httpd-vhosts.conf顶部以确保兜底安全。

默认虚拟主机就是当请求的域名在所有 <virtualhost></virtualhost> 配置中都找不到匹配项时,Apache 会交给它处理的那个主机。它的核心规则很简单:排在最前面、且监听条件最宽泛的那个 <virtualhost></virtualhost> 块,就是默认虚拟主机。
默认虚拟主机怎么确定?
Apache 不靠特殊标签或关键字标记“默认”,而是靠顺序和匹配逻辑:
- 所有
<virtualhost></virtualhost>或<virtualhost _default_:80></virtualhost>都属于“通配型”监听,能响应任意 IP 上对该端口的请求; - 当客户端发起请求(比如访问
abc.com),Apache 会按配置文件从上到下扫描所有<virtualhost></virtualhost>块; - 一旦发现某个块的
ServerName或ServerAlias与请求头中的Host字段完全匹配,就用它; - 如果全部扫完都没匹配上,就用第一个满足监听条件(如
*:80)的块——也就是第一个<virtualhost></virtualhost>。
如何显式设置一个安全的默认主机
推荐把真正想作为兜底的虚拟主机放在 httpd-vhosts.conf 的最顶部,并明确标注用途:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
<virtualhost>
ServerName default.local
DocumentRoot "/var/www/default"
<directory>
Require all granted
</directory>
ErrorLog "logs/default-error.log"
CustomLog "logs/default-access.log" common
</virtualhost><virtualhost>
ServerName site-a.com
ServerAlias www.site-a.com
DocumentRoot "/var/www/site-a"
...
</virtualhost><virtualhost>
ServerName site-b.com
DocumentRoot "/var/www/site-b"
...
</virtualhost>
这样即使有人直接用 IP 访问,或输错域名,也会落到 /var/www/default,不会意外暴露其他站点内容。
常见误区提醒
以下做法容易导致默认行为异常:
- 主配置
httpd.conf中仍保留未注释的DocumentRoot和ServerName:它们可能和第一个虚拟主机冲突,引发 403 或跳转异常; - 用了
<virtualhost></virtualhost>这类具体 IP 的块,但没配对应NameVirtualHost 192.168.1.100:80(Apache 2.2 需要,2.4+ 已自动处理); - 多个
<virtualhost></virtualhost>块里ServerName写了相同值,Apache 只认第一个,其余被忽略; - 忘记启用
httpd-vhosts.conf:确认主配置中有Include conf/extra/httpd-vhosts.conf且未被注释。
验证是否生效
改完配置后执行:
-
apachectl -t或httpd -t确保语法正确; - 重启服务:
systemctl restart apache2(Debian/Ubuntu)或systemctl restart httpd(RHEL/CentOS); - 在本地
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)中加一行:127.0.0.1 fake-domain.test; - 浏览器访问
http://fake-domain.test,看是否加载第一个<virtualhost></virtualhost>的页面。










