apache多站点托管必须为每个站点单独定义virtualhost并指定唯一documentroot,请求按域名匹配对应virtualhost后使用其documentroot定位文件;不支持同一virtualhost内设多个documentroot,子路径区分需靠重写或应用层路由实现。

Apache 多站点托管时,DocumentRoot 的区分不是靠“在一个虚拟主机里设多个根目录”,而是靠为每个站点单独定义一个 VirtualHost,并在每个 VirtualHost 里指定唯一的 DocumentRoot。
换句话说:
每个站点对应一个 <virtualhost></virtualhost> 块,每个块里只能有一个 DocumentRoot,这个路径就是该站点的“唯一根目录”。Apache 通过请求中的域名(或 IP、端口)匹配到对应 VirtualHost,再用它里面的 DocumentRoot 去定位文件。
✅ 正确做法:每个站点一个 VirtualHost
比如你要托管 site-a.com 和 site-b.com:
<virtualhost>
ServerName site-a.com
DocumentRoot "/var/www/site-a.com/public_html"
<directory>
Require all granted
</directory></virtualhost><virtualhost>
ServerName site-b.com
DocumentRoot "/var/www/site-b.com/public_html"
<directory>
Require all granted
</directory></virtualhost>
- 请求
http://site-a.com/→ 匹配第一个 VirtualHost → 从/var/www/site-a.com/public_html下找文件 - 请求
http://site-b.com/→ 匹配第二个 VirtualHost → 从/var/www/site-b.com/public_html下找文件
❌ 常见误解:想在一个 VirtualHost 里配多个 DocumentRoot
Apache 不支持 在同一个 <virtualhost></virtualhost> 中为不同子路径(如 /blog、/shop)设置不同 DocumentRoot。例如下面这种写法是无效的:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
# 错误!DocumentRoot 不能放在 <directory> 里,也不能重复声明
<virtualhost>
DocumentRoot "/var/www/main"
<directory>
# 这里不能改 DocumentRoot!
</directory></virtualhost></directory>
如果真要按路径区分站点(比如 example.com/blog 和 example.com/shop),正确方式是:
- 用 URL 重写(mod_rewrite)+ 符号链接,或
- 把逻辑交给应用层(如 PHP 路由),而不是靠 Apache 切 DocumentRoot。
? 关键前提不能漏
- 确保主配置中已启用虚拟主机支持:取消
httpd.conf或apache2.conf中Include conf/extra/httpd-vhosts.conf的注释 - 每个 DocumentRoot 目录要有正确的读取权限(Apache 进程用户可访问)
-
ServerName必须和实际访问域名一致(开发环境可用/etc/hosts模拟解析) - 修改后务必运行
apachectl -t检查语法,再重启服务
不复杂但容易忽略










