apache多端口匹配依赖host头精确匹配,因浏览器发localhost:8080请求时host头含端口,若servername仅写localhost则无法匹配,导致回退默认虚拟主机;故必须设为localhost:8080等完整格式。

XAMPP 中 Apache 要跑多个端口的站点,ServerName 不能只写域名,必须带端口(如 localhost:8080),否则请求会 fallback 到默认虚拟主机,甚至 404 或错配目录。
为什么 ServerName 必须显式包含端口
Apache 在匹配 VirtualHost 时,先看监听地址(*:8080)是否匹配请求端口,再比对 ServerName 和请求头中的 Host 字段。但开发环境下浏览器访问 localhost:8080 发出的 Host 头是 localhost:8080,不是 localhost —— 如果你只配 ServerName localhost,Apache 就找不到完全匹配项,转而使用第一个定义的 VirtualHost(即默认站点)。
-
ServerName是字符串精确匹配,不自动剥离端口 - 浏览器发请求时,
Host头默认带端口(除非是 80/443) -
ServerAlias同样要写完整,比如ServerAlias localhost:8080
httpd-vhosts.conf 中多端口配置的正确写法
别在 httpd.conf 里硬塞一堆 VirtualHost 块,统一用 conf/extra/httpd-vhosts.conf 管理,且必须和 Listen、NameVirtualHost 协同生效。
- 先确认
httpd.conf中已启用:Include conf/extra/httpd-vhosts.conf(去掉 #) - 在
httpd.conf或httpd-vhosts.conf顶部加监听:Listen 8080、Listen 8081 - 每个端口都要有对应
NameVirtualHost *:8080(Apache 2.4+ 可省略,但显式写更稳) -
VirtualHost标签必须与监听端口一致:<virtualhost></virtualhost>,内部ServerName写localhost:8080
示例:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
DocumentRoot "D:/xampp/htdocs/project-a"
ServerName localhost:8080
ServerAlias 127.0.0.1:8080
</virtualhost><virtualhost>
DocumentRoot "D:/xampp/htdocs/project-b"
ServerName localhost:8081
ServerAlias 127.0.0.1:8081
</virtualhost>
常见错误:端口没通、请求被吞、日志无记录
配置完重启 Apache 却打不开?八成是以下某条没做:
- Windows 防火墙或杀软拦截了非 80 端口(临时关闭测试)
-
DocumentRoot路径含中文或空格,没加引号(必须用双引号包裹) - 忘了给目录加
<directory></directory>权限块,导致 403 Forbidden(XAMPP 默认不自动继承) - 修改的是
httpd-vhosts.conf,但httpd.conf里Include行仍被注释 - 改完没执行
xampp-control.exe中的 “Restart Apache”,只点了 Stop/Start(容易漏 reload)
开发环境绕过域名绑定的实用技巧
不想改系统 hosts 文件?直接用 localhost:端口号 最省事,但要注意:
- 浏览器缓存 Host 头,改完配置后清空 DNS 缓存:
ipconfig /flushdns(Windows) - Chrome 有时会复用连接,强制新标签页访问,或加
?t=xxx避免 304 缓存 - 如果想用
project-a.test这类伪域名,必须在hosts加127.0.0.1 project-a.test,且ServerName改为该域名(不带端口) - 同一端口下多个域名要用
ServerAlias,但不同端口之间严禁混用ServerName(比如localhost:8080和localhost:8081必须分开定义)
最易被忽略的一点:Apache 2.4 默认禁用 AllowOverride All,如果你依赖 .htaccess,记得在每个 VirtualHost 里补上 <directory> AllowOverride All </directory>。










