caddy 的 php_fastcgi 未设置 path_info 导致 symfony 路由 404;需用 try_files 归一化路径后,通过 env path_info {http.request.uri.path} 注入带前导斜杠的完整路径。

Symfony 软路由在 FrankenPHP + Caddy 下无法匹配 index.php 以外的路径,本质是 Caddy 的重写规则没把请求正确透传给 FrankenPHP 的 PHP-FPM 处理器 —— 不是 Symfony 配置问题,而是 Caddy 规则漏掉了对 PATH_INFO 的构造。
Caddy 中 php_fastcgi 没传递 PATH_INFO 导致 Symfony 路由 404
FrankenPHP 启动时默认以 index.php 为前端控制器,但 Symfony 的软路由(如 /api/users)依赖 PATH_INFO 环境变量来解析子路径。Caddy 的 php_fastcgi 指令默认不设置该变量,FrankenPHP 收到的请求里 $_SERVER['PATH_INFO'] 为空,Router 只能匹配根路径。
- 现象:
GET /正常,GET /api/users返回 404(Symfony 层),且日志中无路由匹配记录 - 验证方式:在
public/index.php开头加var_dump($_SERVER['PATH_INFO'] ?? 'MISSING');,访问非根路径时输出MISSING - 解决关键:用
env子指令手动注入PATH_INFO,值需从 URI 中提取(排除index.php前缀)
Caddyfile 中必须用 try_files + uri 重写配合 env
不能只靠 php_fastcgi,必须前置路径归一化:把所有非静态资源请求重写为 /index.php/{path} 格式,再由 env 提取 {path} 注入 PATH_INFO。
- 静态资源(
.css,.js,.png等)应直接返回,不进 PHP - 关键规则顺序:先
try_files判断文件存在 → 不存在则重写 URI → 再php_fastcgi并设env - 示例片段:
handle_path /* {
try_files {path} /index.php{path}
php_fastcgi 127.0.0.1:8080 {
env PATH_INFO {http.request.uri.path}
# 注意:FrankenPHP 要求 PATH_INFO 必须以 / 开头,所以 {http.request.uri.path} 是安全的
}
}
⚠️ 错误写法:env PATH_INFO {path} —— {path} 在重写后是相对路径(如 api/users),缺开头斜杠,Symfony 解析失败。
FrankenPHP 的 FRANKENPHP_INDEX 和 Caddy 的路径需对齐
FrankenPHP 默认用 index.php 作入口,但如果你改过 FRANKENPHP_INDEX(比如设为 app.php),Caddy 的 try_files 和 env PATH_INFO 也必须同步调整,否则路径截断错位。
- 检查 FrankenPHP 启动命令或
.env:确认FRANKENPHP_INDEX=index.php(默认值) - 若自定义入口,Caddy 中所有
/index.php字符串都要替换成对应文件名 - 更稳妥做法:保持
FRANKENPHP_INDEX=index.php,仅通过 Symfony 配置控制环境(如APP_ENV=prod),避免双端不一致
调试时优先检查 $_SERVER 实际值而非日志
Symfony 日志里的 “No route found” 容易误导人以为是路由配置错误,其实根源常在服务器层变量缺失。最有效的方式是临时在 public/index.php 顶部输出原始 $_SERVER:
file_put_contents('/tmp/caddy_env.log', print_r($_SERVER, true), FILE_APPEND);
die('env dumped');
然后 curl 一个深层路径,直接看 /tmp/caddy_env.log 里 PATH_INFO、SCRIPT_NAME、REQUEST_URI 是否符合预期(例如 PATH_INFO 应为 /api/users,SCRIPT_NAME 应为 /index.php)。不看到真实值,调规则就是盲猜。
真正卡点往往就在这里:Caddy 规则写了,但 PATH_INFO 还是空,说明 env 没生效或变量名拼错(比如写成 Path_Info)—— FrankenPHP 对大小写敏感,必须全大写。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











