多个VirtualHost块监听相同端口(如*:80)本身不冲突,Apache依靠Host字段与ServerName/ServerAlias匹配实现多站共存;需确保每个块有唯一域名、合理配置顺序、完整Directory权限及避免重复根目录拆分。

多个 VirtualHost 块监听相同端口(比如都用 *:80)本身不冲突,Apache 本来就是靠这个实现“一个端口跑多个网站”的。真正出问题的,是配置逻辑没理清——比如 ServerName 漏配、匹配顺序错乱、默认主机抢走请求,或者权限没同步到位。
必须确保每个站点有唯一的 ServerName 或 ServerAlias
Apache 在同一端口上区分站点,全靠请求头里的 Host 字段和配置中的 ServerName/ServerAlias 匹配。如果两个块都没写 ServerName,或都写了同一个域名,那只有第一个块生效,其余请求会被它“吞掉”。
- 正确示例:
<VirtualHost *:80><br> ServerName site1.example.com<br> DocumentRoot /var/www/site1<br> </VirtualHost>
<VirtualHost *:80><br> ServerName site2.example.com<br> ServerAlias www.site2.example.com<br> DocumentRoot /var/www/site2<br> </VirtualHost>
- 错误做法:两个块都只写
<VirtualHost *:80>却没配ServerName;或其中一个漏了www别名,导致用户访问 www 时跳到另一个站
注意配置加载顺序和默认虚拟主机干扰
Apache 按文件读取顺序逐个比对 VirtualHost,一旦匹配就停止查找。如果你把泛匹配或 _default_ 块放在最后,它会兜底所有未明确命中的请求——看着像“冲突”,其实是被默认块截胡了。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 建议把最具体的站点(如带完整域名的)放前面,通配或默认块放最后
- 避免使用
<VirtualHost _default_:80>,除非你真需要它做兜底;更稳妥的是用<VirtualHost *:80>配一个最小化的 fallback 站点,并确保它不干扰主业务 - 运行
sudo apache2ctl -S查看实际加载顺序和匹配结果,重点关注 “port 80” 下列出的各个块是否按预期排布
共用根目录时别拆多个 VirtualHost 块
如果多个域名要指向同一套代码(比如 example.com 和 www.example.com),不要为每个域名单独写一个 <VirtualHost *:80>。Apache 不允许也不需要这样——它只会认第一个,后面那个的权限、日志、重写规则等很可能不生效,还容易引发 403 错误。
- 正确做法:一个
<VirtualHost *:80>块内写多个ServerAlias
ServerName example.com<br> ServerAlias www.example.com blog.example.com
- 确保该块里完整配置了
<Directory "/var/www/myapp">权限、AllowOverride、日志路径等,所有域名共享同一套行为
别忽略权限和 Directory 指令的一致性
即使 ServerName 都配对了,如果某个 VirtualHost 块里没写 <Directory> 或权限设得太严(比如漏了 Require all granted),Apache 在匹配到该块后仍可能因目录拒绝而返回 403 —— 这不是端口冲突,但表现很像“某个站打不开”。
- 每个
<VirtualHost>块中,只要用了自定义DocumentRoot,就应配套配置对应路径的<Directory> - 推荐统一用现代语法:
<Directory "/var/www/site1"><br> Require all granted<br> </Directory>

















