应使用一个VirtualHost块配合多个ServerAlias,而非多个VirtualHost块;ServerName设主域名,ServerAlias列其余域名,hosts文件需逐条映射,避免配置冗余导致匹配失效。

直接用 ServerAlias,别写多个 <VirtualHost> 块——那是常见误区,会导致只有第一个域名生效,其余全 fallback 到它。
一个 VirtualHost 块 + 多个 ServerAlias
这是最简洁、最可靠的做法。所有想共用同一目录的域名,都放在同一个 <VirtualHost *:80> 里,主域名用 ServerName,其余用 ServerAlias 补充。
-
ServerName写一个主域名(如dev.local),必须和 hosts 文件中映射的一致 -
ServerAlias后面跟多个域名,用空格分隔(如site1.local site2.local test.dev) -
DocumentRoot只需定义一次,路径要真实存在、有读取权限,结尾不加斜杠 - 配套的
<Directory>权限块也只需一份,覆盖全部别名
hosts 文件必须逐条映射
Windows 或 macOS 的 C:\Windows\System32\drivers\etc\hosts 或 /etc/hosts 里,每个域名都要单独写一行指向 127.0.0.1:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
127.0.0.1 dev.local127.0.0.1 site1.local127.0.0.1 site2.local
注意:ServerAlias 支持通配符(如 *.dev.local),但 hosts 文件不支持通配符映射,必须手动列全。
避免多个同端口 VirtualHost 块
如果为每个域名单独写一个 <VirtualHost *:80>,即使 DocumentRoot 完全相同,Apache 也不会并行匹配——它只按顺序检查 ServerName 和 ServerAlias,没匹配上的请求一律落到第一个块,造成“看似都行,实则不可控”。
- 现象:访问
site2.local显示的是site1.local的内容 - 现象:改了第二个块的
DocumentRoot,两个域名同时变——说明根本没进第二个块 - 现象:加第三个块后 Apache 启动失败,报错
DocumentRoot must be a directory——路径可能不存在或权限不对,但本质是配置冗余引发连锁问题
确认配置已启用且语法正确
确保 Apache 实际加载了虚拟主机配置:
- 检查
httpd.conf中是否启用了Include conf/extra/httpd-vhosts.conf(去掉前面的#) - 运行
httpd -t(Windows)或apachectl configtest(Linux/macOS)验证语法 - 重启 Apache 后再测试,不要跳过这步

















