多站点共用同一根目录本质是多域名指向同一套文件,正确做法是单个块配合多个serveralias及hosts逐条映射,禁用多个同端口virtualhost块以避免仅首块生效或403错误。

多站点共用同一个根目录,本质不是“多个站点”,而是多个域名指向同一套文件。Apache 不允许也不需要为同一目录写多个 <virtualhost></virtualhost> 块——那样不仅无效,还会引发冲突或仅首个生效。
正确做法是:一个 <virtualhost></virtualhost> 块 + 多个 ServerAlias + 对应的 hosts 映射。
✅ 必须用 ServerAlias,不能写多个同端口的 <virtualhost></virtualhost>
Apache 的匹配逻辑是:请求进来后,按顺序扫描所有 <virtualhost></virtualhost>,一旦 ServerName 或 ServerAlias 匹配成功,就进入该块处理;否则落到第一个定义的块(默认虚拟主机)。
如果你写了两个块都指向 D:/www/myapp,但只在第一个块里配了权限,第二个块没配 <directory></directory>,那访问第二个域名时极可能报 403 Forbidden——因为 Apache 实际没进第二个块,而是 fallback 到第一个块,但路径或权限可能不一致。
✅ 配置示例(XAMPP / WAMP / 手动 Apache 均适用)
打开 httpd-vhosts.conf,添加如下内容:
<virtualhost>
DocumentRoot "D:/www/myapp"
ServerName dev.local
ServerAlias test.local staging.local local.dev
<directory>
Require all granted
AllowOverride All
</directory></virtualhost>
注意:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
DocumentRoot只写一次,路径必须真实存在、末尾不要加斜杠 -
ServerName是主域名(必须和hosts里第一条一致) -
ServerAlias每个域名占一行或空格分隔(Apache 支持),但推荐每行一个,清晰不易错 -
<directory></directory>路径必须与DocumentRoot完全一致,且必须包含Require all granted
✅ hosts 文件要逐条映射(Windows/macOS/Linux 都一样)
用管理员权限编辑:
- Windows:
C:\Windows\System32\drivers\etc\hosts - macOS/Linux:
/etc/hosts
追加:
127.0.0.1 dev.local 127.0.0.1 test.local 127.0.0.1 staging.local 127.0.0.1 local.dev
⚠️ 注意:
- 每行一个,不能用逗号、空格或通配符(如
*.local在 hosts 里无效) - 行首尾不能有空格,IP 和域名之间用单个 Tab 或空格分隔即可
- 改完保存后,命令行运行
ping dev.local确认返回127.0.0.1
✅ 验证与排错要点
- 修改完配置后,必须重启 Apache(XAMPP 控制面板点 restart,或命令行
httpd -k restart) - 访问
http://dev.local和http://test.local应显示完全相同的内容 - 若出现 403:检查
<directory></directory>是否存在、路径是否拼错、权限是否Require all granted - 若出现 404:确认
DocumentRoot目录下有index.html或index.php,且文件名大小写正确(Linux 敏感) - 若域名无法解析:
ping不通 → 检查 hosts;ping通但打不开 → 检查 Apache 是否监听 80 端口、防火墙是否拦截
不需要 PHP-FPM 或 mod_php 特别调整——共用目录对 PHP 执行模式无影响。只要 Apache 正确分发请求,PHP 就照常执行当前 DocumentRoot 下的脚本。










