FrankenPHP下Symfony全404应先查三处:一是启动命令是否正确指向public/index.php并启用--worker;二是public/index.php是否手动添加FrankenPHP::handle()且位置在autoload_runtime.php之前;三是$_SERVER['PATH_INFO']是否为空,确认是否启用--path-info标志。

FrankenPHP下Symfony路由全404先查哪几处
FrankenPHP部署Symphony后所有路由(包括/、/login、/api)全部404,大概率不是路由定义错了,而是请求压根没进到Symfony的PHP执行层——FrankenPHP作为SAPI替代品,接管方式和传统FPM/Nginx有本质差异,必须优先确认它是否真正“启动并挂载”了你的应用。
确认FrankenPHP是否已加载项目入口
FrankenPHP不依赖index.php被Web服务器转发,而是直接运行PHP脚本并监听HTTP;如果它没正确加载public/index.php,就会跳过整个Symfony内核,直接返回404。验证方法极简:
- 检查启动命令是否指向
public/index.php:比如frankenphp run --worker public/index.php,不能是frankenphp run --worker .或src/Kernel.php - 在
public/index.php第一行加<?php die('frankenphp hit'); ?>,再访问任意路径;无输出=FrankenPHP根本没执行该文件 - 确认
FRANKENPHP_WORKER环境变量未被覆盖(尤其在Docker中),否则会降级为静态文件服务模式,忽略PHP逻辑
检查public/index.php是否符合FrankenPHP要求
Symfony默认public/index.php适配传统SAPI,FrankenPHP需要显式调用FrankenPHP\handle()才能激活路由。原生生成的index.php不包含此调用,必须手动补上:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
<?php
use FrankenPHP\FrankenPHP;
// 必须放在所有逻辑之前,且只调用一次
if (FrankenPHP\is_worker()) {
FrankenPHP\handle();
}
// 原有Symfony启动逻辑保持不变
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
return function (array $context) {
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};
- 漏掉
FrankenPHP\handle()会导致所有非静态资源(即所有路由)全部404,因为FrankenPHP不知道要将请求交给Symfony处理 - 不能把
handle()放在autoload_runtime.php之后,否则Kernel尚未初始化,路由注册尚未发生 - 若使用
frankenphp serve开发命令,它会自动注入handle(),但上线用run --worker时必须手写
验证路由是否被FrankenPHP正确传递
FrankenPHP将原始REQUEST_URI直接透传给PHP,但Symfony的Router依赖$_SERVER['SCRIPT_NAME']和$_SERVER['PATH_INFO']推导当前路径;若这些变量为空或错乱,路由匹配必然失败:
立即学习“PHP免费学习笔记(深入)”;
- 在
public/index.php中临时打印:var_dump($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'], $_SERVER['PATH_INFO']); - 正常情况:
REQUEST_URI应为/login,SCRIPT_NAME为/index.php,PATH_INFO为/login;若PATH_INFO为空,说明FrankenPHP未正确分割路径,需检查是否启用了--path-info标志(v1.2+默认启用,旧版需显式加) - 确保
APP_ENV=prod且debug=false已生效——FrankenPHP在debug模式下可能绕过部分路由缓存机制,导致开发环境能通、生产环境全404
FrankenPHP对路径解析和入口挂载非常敏感,一个handle()调用缺失或PATH_INFO未正确提取,就足以让整个Symfony路由表失效;比起传统Nginx配置,这里更需要盯着public/index.php的执行流和$_SERVER变量状态。


















