根本原因是Apache未启用mod_rewrite模块且虚拟主机中未配置重写规则,导致Flight的前端控制器模式失效,请求无法经index.php分发。

为什么 Flight 框架在 XAMPP 多端口下常 404 或路由失效
根本原因不是 Flight 本身,而是 Apache 默认不把请求转发给 index.php —— Flight 依赖前端控制器模式,所有请求必须经由它分发。XAMPP 启用多端口后,若没同步配置每个 <virtualhost></virtualhost> 的重写规则,/user/login 这类路径会被当作真实子目录查找,直接 404。
常见错误现象:http://localhost:8080/user/login 返回 404,但 http://localhost:8080/index.php/user/login 能正常响应。
- 确保每个
<virtualhost></virtualhost>块内都包含<directory></directory>配置段,不能只在主配置里设一次 -
AllowOverride All必须启用,否则.htaccess文件被忽略 - Windows 下路径分隔符用正斜杠
/(如C:/xampp/htdocs/flight-app),反斜杠会触发 Apache 解析失败
如何为每个端口单独配好 Flight 的重写规则
Flight 官方推荐用 .htaccess 实现路由,但 XAMPP 多端口场景下,更稳妥的是直接在 httpd-vhosts.conf 中硬编码重写逻辑 —— 避免因 AllowOverride 生效顺序或文件权限导致的不可控。
示例:为端口 8080 绑定 Flight 项目
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
<VirtualHost *:8080>
ServerName localhost
DocumentRoot "C:/xampp/htdocs/flight-app"
<Directory "C:/xampp/htdocs/flight-app">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
# 手动嵌入 Flight 重写逻辑,绕过 .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>
</VirtualHost>-
RewriteEngine On必须显式开启,XAMPP 默认关闭重写模块 -
AllowOverride None是故意的:既然不用.htaccess,就禁掉它,避免冲突 - 别漏掉
Require all granted,否则 Apache 2.4+ 会直接 403
端口监听与虚拟主机配置容易漏掉的关键检查点
多端口部署失败,80% 出在 httpd.conf 和 httpd-vhosts.conf 的联动缺失。光加 Listen 8080 不够,Apache 不知道该把 8080 的请求交给谁处理。
- 确认
httpd.conf中已取消注释:Include conf/extra/httpd-vhosts.conf - 每个新增端口必须在
httpd.conf顶部有对应Listen行,例如:Listen 8080、Listen 8081 -
httpd-vhosts.conf中每个<virtualhost></virtualhost>必须有唯一DocumentRoot,且路径不能以斜杠结尾 - 改完配置后,务必运行
httpd -t验证语法,再重启 Apache;XAMPP 控制面板里 Start 按钮瞬间变灰,基本就是配置写错了
Flight 项目目录结构与权限注意事项
Flight 对目录结构无强制要求,但 XAMPP Windows 环境下,某些路径组合会让重写规则静默失效 —— 尤其是路径含空格或中文时。
- 项目根目录建议放在
C:/xampp/htdocs/下一级,如C:/xampp/htdocs/flight-api,避免嵌套过深 -
index.php必须位于DocumentRoot目录下,不能放在子文件夹里(如public/index.php)除非你同步调整重写规则中的目标路径 - 如果使用 Composer 自动加载,确保
vendor/autoload.php路径在index.php中正确引用,相对路径容易在多端口下出错,建议用__DIR__
最易被忽略的一点:XAMPP 默认禁用 mod_rewrite 模块。打开 httpd.conf,搜索 mod_rewrite.so,确认前面没有 # 注释 —— 这个模块不启用,上面所有重写规则全无效。

















