documentroot 在 apache 中按路由优先级生效:全局设置仅作兜底,虚拟主机内必须显式定义且互不影响;请求匹配到 virtualhost 后直接使用其 documentroot,不继承全局值。

Apache 的 DocumentRoot 指令作用范围明确:全局配置中的 DocumentRoot 仅在没有启用虚拟主机时生效;一旦定义了 <virtualhost></virtualhost> 块,该块内的 DocumentRoot 就会完全覆盖全局设置,且彼此之间互不影响。
换句话说,Apache 不是“继承+覆盖”,而是“路由优先级取代”。请求进来后,Apache 先匹配到某个 <virtualhost></virtualhost>(按 IP:port + ServerName/ServerAlias),然后直接使用该虚拟主机内声明的 DocumentRoot,根本不会参考全局 DocumentRoot 的值。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
✅ 虚拟主机内 DocumentRoot 是独立生效的
每个 <virtualhost></virtualhost> 必须显式定义自己的 DocumentRoot,否则会回退到 Apache 缺省路径(如 /var/www/html 或 XAMPP 的 htdocs),而不是继承全局值。
- 全局
DocumentRoot "/var/www/default" -
<virtualhost></virtualhost>
ServerName site-a.com
DocumentRoot "/var/www/site-a"← 这个才真正生效 -
<virtualhost></virtualhost>
ServerName site-b.com
DocumentRoot "/var/www/site-b"← 它和上面的互不干扰
访问 site-a.com → 用 /var/www/site-a
访问 site-b.com → 用 /var/www/site-b
访问未匹配域名(或直接 IP)→ 可能落到第一个 <virtualhost></virtualhost> 或默认主机(取决于配置顺序与 _default_ 设置)
⚠️ 全局 DocumentRoot 实际上只起“兜底”作用
- 如果你没配任何
<virtualhost></virtualhost>,或者请求没匹配到任何ServerName/ServerAlias,Apache 才会用全局DocumentRoot。 - 它不能作为多个虚拟主机的默认基础路径,也不能被子容器(如
<directory></directory>)继承来推导路径。 - 它甚至不能出现在
<virtualhost></virtualhost>内部——语法错误,DocumentRoot的合法上下文只有 server config 和 virtual host,不允许嵌套。
? 配置时的关键提醒
-
<virtualhost></virtualhost>必须监听明确端口(如*:80),且ServerName必须与 DNS 或 hosts 文件一致,否则请求无法正确路由,就会“掉”进默认站点(常误以为是全局 DocumentRoot 生效)。 - 多个虚拟主机共存时,顺序重要:Apache 使用“第一个匹配”规则,未加
ServerName的<virtualhost></virtualhost>可能意外捕获所有请求。 - 全局
DocumentRoot只需存在一个,重复定义会被忽略或报错;而每个<virtualhost></virtualhost>必须有且仅有一个DocumentRoot。
不复杂但容易忽略。










