Apache默认虚拟主机由配置加载顺序决定,即第一个匹配请求的<VirtualHost>块(如<VirtualHost *:80>),而非显式指定;若所有ServerName/ServerAlias均未匹配,请求将落到首个虚拟主机,其需包含完整权限设置(Require all granted)和DirectoryIndex指令,可用httpd -S命令验证实际默认主机。

Apache 的默认虚拟主机,就是当请求的域名未匹配到任何 <VirtualHost> 块时,Apache 会 fallback 到的第一个被加载的虚拟主机配置。它不是靠“指定”某个标签来定义的,而是由配置加载顺序和主配置中是否保留原始 DocumentRoot / ServerName 决定的。
默认虚拟主机由加载顺序决定
Apache 按照配置文件(包括 httpd.conf 及其 Include 的子配置)从上到下读取 <VirtualHost> 块。排在最前面、且能成功匹配请求(比如 <VirtualHost *:80>)的那个,就是默认虚拟主机。
- 如果所有
VirtualHost都指定了ServerName或ServerAlias,而客户端请求的 Host 头不匹配任何一个,则第一个VirtualHost被选中 - 如果主配置中仍保留了未注释的
DocumentRoot和ServerName(即全局作用域),那么这些设置会作为兜底行为,影响默认响应——但此时它已不是严格意义上的“虚拟主机”,而是主服务器上下文 - 建议:把真正想用作默认站点的
<VirtualHost *:80>放在所有其他虚拟主机之前,并确保它没有ServerName或只写通配(如ServerName _default_),或干脆不设ServerName
用 ServerName 控制匹配优先级
ServerName 本身不“指定默认”,但它参与 Host 头匹配逻辑。Apache 会优先匹配显式声明的 ServerName 或 ServerAlias;没匹配上的请求才落到第一个虚拟主机。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 若你希望某个站点作为兜底,默认虚拟主机里可以不写
ServerName,或写一个不会被 DNS 解析的名称(如ServerName default.site) - 也可以使用
ServerName *(不推荐)或ServerName _default_(仅限某些旧版本),但 Apache 官方推荐方式是依赖顺序 + 空匹配 - 注意:
ServerName还用于消除启动警告(AH00558),必须在全局作用域(httpd.conf顶部)设置一次,例如:ServerName localhost
确保默认站点能正确响应 PHP 和目录索引
即使成了默认虚拟主机,若访问时出现 403 或空白页,大概率是权限或索引设置缺失。
- 确认该
<VirtualHost>内含完整权限段:<Directory "/path/to/docroot"> Require all granted </Directory>(Apache 2.4+) - 添加
DirectoryIndex index.html index.php,否则请求目录时可能报错或列出文件 - 启用 PHP 解析:
AddType application/x-httpd-php .php,并确保libphp.so已加载
验证和调试技巧
别靠猜测判断哪个是默认主机,用工具确认:
- 运行
httpd -S(或apachectl -S),它会输出所有虚拟主机及其匹配顺序、端口、ServerName 和文档根路径 - 检查输出中 “default server” 后面跟的是哪个配置路径和行号,那就是当前默认虚拟主机
- 用
curl -H "Host: nonexistent.example" http://your-server-ip/模拟未匹配请求,观察返回内容是否来自预期目录

















