根本原因是Apache默认配置中<Directory />块的Require all denied全局拦截,未显式放开非80端口对应目录权限;同时需确保Listen端口与VirtualHost端口严格一致、防火墙放行且文件权限正确。

为什么一个域名配多个端口会 403 或直接拒绝连接
根本原因不是 Apache 不支持,而是默认配置把所有非 80 端口的请求拦在了门外。关键在 httpd.conf 里那段被注释掉的权限控制块:<Directory /> 下的 Require all denied。只要没显式放开对应端口目录的访问权限,哪怕 Listen 8001 写对了、<VirtualHost *:8001> 也加了,照样 403。
实操建议:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 必须修改
httpd.conf中的全局<Directory />块,把Require all denied改成Allow from all(旧版)或Require all granted(新版 Apache 2.4+) - 不能只改
<VirtualHost>里的<Directory "xxx">,那是局部权限,挡不住根目录级拦截 - 确认
Include conf/extra/httpd-vhosts.conf这行没被注释,否则httpd-vhosts.conf根本不加载
Listen 和 VirtualHost 端口号必须严格一致
常见错误是 httpd.conf 里写了 Listen 8081,但 httpd-vhosts.conf 里写成 <VirtualHost *:8080> —— Apache 不会自动映射,端口不匹配就完全不响应请求,浏览器显示“连接被拒绝”或超时。
实操建议:
- 每个新增端口都要在
httpd.conf的Listen段落中单独声明一行,比如要开8081和8082,就得写两行:Listen 8081、Listen 8082 -
httpd-vhosts.conf中每个<VirtualHost *:PORT>的PORT必须和Listen行完全一致,包括数字和冒号格式(不要写Listen: 8081,应为Listen 8081) - Windows 下可用
netstat -ano | findstr :8081验证端口是否真被 Apache 占用,避免被其他程序抢占
同一个域名在不同端口指向不同项目目录
想让 localhost:8081 指向 htdocs/project-a,localhost:8082 指向 htdocs/project-b,不需要改 hosts 文件——localhost 本身就是 127.0.0.1,天然解析成功。重点是 ServerName 要写对,且 DocumentRoot 路径必须存在、有读取权限。
实操建议:
-
httpd-vhosts.conf中两个配置可并存,互不干扰:<VirtualHost *:8081><br> DocumentRoot "D:/xampp/htdocs/project-a"<br> ServerName localhost<br></VirtualHost><br><br><VirtualHost *:8082><br> DocumentRoot "D:/xampp/htdocs/project-b"<br> ServerName localhost<br></VirtualHost>
-
ServerName写localhost就够,不用加端口(localhost:8081是浏览器地址栏写的,不是配置项) - 路径中的斜杠统一用正斜杠
/或双反斜杠\,单反斜杠在 Windows 下可能被误解析为转义字符
防火墙和浏览器缓存是隐形拦路虎
配置全对、Apache 重启成功,但浏览器打不开 localhost:8081?大概率是 Windows 防火墙把新端口拦了,或者浏览器缓存了旧的 404/403 响应,一直不发新请求。
实操建议:
- 进「Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → TCP → 特定本地端口 → 填入
8081,8082→ 允许连接」 - 测试前清空浏览器缓存,或直接用隐身窗口访问;也可用
curl -v http://localhost:8081绕过浏览器判断真实响应 - 如果用 Chrome 访问提示“您的连接不是私密连接”,说明你误启用了 HTTPS 配置(比如改了
httpd-ssl.conf),而没配证书——此时应确保只监听 HTTP 端口,不碰 SSL 相关配置
<Directory /> 权限和防火墙放行——这两处一漏,前面所有操作都白忙。

















