xampp本身不支持同一项目目录在两个端口上完全独立、互不干扰运行,因documentroot绑定路径而非端口;但可通过配置多virtualhost指向同一目录模拟双端口访问,或在php代码中基于$_server['server_port']动态切换环境。

直接说结论:XAMPP 本身不支持「同一个项目目录」在两个端口上 *完全独立、互不干扰* 地运行——因为 Apache 的 DocumentRoot 是按 <virtualhost></virtualhost> 绑定的,端口只是监听入口,不是隔离沙盒。但你可以用两种方式“模拟”同一项目跑两个端口,关键看你要解决什么问题。
为什么不能直接让 localhost:8080 和 localhost:8081 指向同一个 DocumentRoot 却表现不同?
Apache 默认允许这样配置,但实际会遇到三个硬性限制:
- 所有请求都走同一套
.htaccess规则、同一套 PHP 环境($_SERVER['SERVER_PORT']可读,但框架/路由层通常不自动区分端口) - 浏览器同源策略下,
localhost:8080和localhost:8081是不同源,前端 localStorage、cookie(未设Domain或Port)完全隔离——这不是 Apache 配置能绕过的 - 如果项目里硬编码了
http://localhost:8080这类地址(比如 API 调用、图片路径),换端口就 404 或跨域失败
想做本地跨域测试(比如 JSONP、CORS 验证)?直接配两个端口就行
这是最常见也最合理的使用场景。你不需要改项目代码,只要确保两个端口都能访问到同一套文件,并且明确它们是不同源即可。
操作步骤:
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
- 编辑
D:\xampp\apache\conf\httpd.conf,在Listen 80下追加两行:Listen 8080和Listen 8081 - 确认
Include conf/extra/httpd-vhosts.conf这行前面没有#(即已启用虚拟主机) - 编辑
D:\xampp\apache\conf\extra\httpd-vhosts.conf,末尾添加:
<virtualhost>
DocumentRoot "D:/xampp/htdocs/myproject"
<directory>
Require all granted
AllowOverride All
</directory></virtualhost><p><virtualhost>
DocumentRoot "D:/xampp/htdocs/myproject"
<directory>
Require all granted
AllowOverride All
</directory></virtualhost></p>
重启 Apache 后,http://localhost:8080 和 http://localhost:8081 都能打开同一项目。注意:此时 localhost:8080/api/data 和 localhost:8081/api/data 是两个独立请求源,适合测跨域逻辑。
想让两个端口加载不同配置(比如 dev/staging 环境变量)?得靠 PHP 层判断
Apache 不提供端口级环境切换,但你可以利用 $_SERVER['SERVER_PORT'] 在代码里分流:
- 在项目入口(如
index.php)开头加判断:
if ($_SERVER['SERVER_PORT'] == '8080') {
define('ENV', 'dev');
} elseif ($_SERVER['SERVER_PORT'] == '8081') {
define('ENV', 'staging');
}
- 后续所有数据库连接、API 域名、日志路径等,都基于
ENV切换 - 注意:这种方案要求项目本身支持运行时环境识别;Laravel、Symfony 等框架原生支持,纯自写脚本需手动实现
容易被忽略的关键点
很多人配完端口打不开,根本原因往往不是配置错,而是:
-
httpd-vhosts.conf里没写<directory></directory>权限块,或写法过时(比如还在用Order Deny,Allow,Apache 2.4 必须用Require all granted) - Windows 自带的 IIS 或 Skype 占用了 8080/8081,检查方法:
netstat -ano | findstr :8080 - 防火墙拦截了新端口(尤其公司网络),临时关闭防火墙测试一次就能排除
- 浏览器缓存了旧的 301 重定向或 HSTS 策略,换隐身窗口或清 DNS 缓存(
ipconfig /flushdns)再试
端口本身只是数字,真正决定行为的是你如何用它——别指望 Apache 替你做环境隔离,该在代码里写的分支,躲不掉。










