XAMPP本身不提供API版本控制能力,但可通过多端口+独立PHP版本/配置+VirtualHost路由隔离实现真正运行时隔离的v1/v2 API,关键在于每个端口绑定不同PHP解析环境与逻辑,而非仅URL路径区分。

直接说结论:XAMPP 本身不提供 API 版本控制能力,但你可以用多端口 + 独立 PHP 版本/配置 + 路由隔离,模拟出“v1/v2 API”的行为。关键不是加端口,而是让每个端口跑不同逻辑、不同 PHP 解析环境、且互不干扰。
为什么不能只靠 .htaccess 或路由前缀做版本控制
本地开发时,很多人想用 http://localhost/api/v1/ 和 http://localhost/api/v2/ 区分版本——这在 Nginx/Apache 生产环境可行,但在 XAMPP 本地调试中极易踩坑:
- Apache 默认未启用
mod_rewrite,.htaccess文件被忽略,v1/v2路径会 404 - 即使开启重写,所有请求仍走同一 PHP 进程、同一
php.ini、同一扩展(如opcache开关状态),无法真正隔离运行时行为 - PHP 版本升级后旧 API 可能因语法变更(如
??操作符、match表达式)直接报错,而你无法让 v1 继续用 PHP 7.4、v2 用 PHP 8.2
用 Listen + VirtualHost 绑定不同端口跑不同 API 版本
这才是 XAMPP 下最可控的方式:每个端口对应一个明确的 PHP 版本、独立的 DocumentRoot、可选的专属 php.ini。浏览器或 Postman 访问 http://localhost:8080 就是 v1,http://localhost:8081 就是 v2。
操作要点:
- 在
C:\xampp\apache\conf\httpd.conf的Listen 80下追加两行:Listen 8080和Listen 8081 - 确保
Include "conf/extra/httpd-vhosts.conf"这行没被注释 - 编辑
C:\xampp\apache\conf\extra\httpd-vhosts.conf,末尾添加两个<VirtualHost>块:
<VirtualHost *:8080>
ServerName localhost
DocumentRoot "C:/xampp/htdocs/api-v1"
<Directory "C:/xampp/htdocs/api-v1">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:8081>
ServerName localhost
DocumentRoot "C:/xampp/htdocs/api-v2"
<Directory "C:/xampp/htdocs/api-v2">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
重启 Apache 后,http://localhost:8080/users 和 http://localhost:8081/users 就是完全隔离的两个入口。
如何让不同端口加载不同 PHP 版本(比如 v1 用 PHP 7.4,v2 用 PHP 8.2)
这是真正实现“API 版本控制”的底层支撑。XAMPP 主安装只带一个 PHP,但你可以手动引入外部 PHP,并为每个端口指定模块路径。
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
前提条件:
- 下载 VC15 编译的 PHP 7.4(如
php-7.4.33-Win32-vc15-x64)和 VC16 编译的 PHP 8.2(如php-8.2.12-Win32-vs16-x64),解压到C:/php/php-7.4.33和C:/php/php-8.2.12 - 确认每个目录下有
php8apache2_4.dll(Windows)和php.ini
然后,在 httpd-vhosts.conf 中,把上面两个 <VirtualHost> 块分别改造成:
<VirtualHost *:8080>
ServerName localhost
DocumentRoot "C:/xampp/htdocs/api-v1"
LoadModule php7_module "C:/php/php-7.4.33/php8apache2_4.dll"
PHPIniDir "C:/php/php-7.4.33"
<Directory "C:/xampp/htdocs/api-v1">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
⚠️ 注意:LoadModule 必须放在 <VirtualHost> 内部(XAMPP 允许,但 Apache 官方不推荐;此处为绕过主配置硬绑定所必需);若 Apache 启动失败,大概率是 DLL 编译版本不匹配(VC15/VC16)或路径含空格未加引号。
客户端调用时必须注意的兼容性细节
前端或移动端发请求时,端口差异会带来几个隐藏问题:
- CORS 不是自动跨端口放行的:
http://localhost:3000请求http://localhost:8080仍算跨域,需在 API 返回头里加Access-Control-Allow-Origin: http://localhost:3000 - Android App 调用
http://localhost:8080会失败——手机无法解析localhost,必须用电脑局域网 IP(如http://192.168.1.100:8080),且 AndroidManifest.xml 中要配android:usesCleartextTraffic="true"或network_security_config.xml - Postman 测试没问题,但 Axios/Fetch 在浏览器里报 CORS,是因为浏览器策略比工具严格;别跳过服务端响应头设置
真正的难点不在加端口,而在于每个端口背后是否真有独立的 PHP 运行时、独立的扩展加载、独立的 php.ini 配置(比如 v1 关闭 display_errors,v2 开启)。漏掉任意一环,“多版本”就只剩 URL 差异,毫无实际意义。

















