frankenphp启动后根路径404主因是未启用url重写,需配置frankenphp.yaml:document_root设为public,添加rewrite规则将请求内部重写至/index.php并设status:200,改后重启服务。

FrankenPHP 启动后访问根路径返回 404
这通常不是 Symfony 路由没配好,而是 FrankenPHP 根本没把请求交给 Symfony 的 public/index.php 处理。FrankenPHP 默认不启用 URL 重写,所有非 index.php 路径都会被当作静态文件查找——找不到就直接 404。
确认方式:访问 https://your.site/index.php,如果能打开 Symfony 欢迎页或调试页,说明 PHP 和框架本身没问题;但 /about 或 /api/users 报 404,问题就在入口转发环节。
解决方法是显式配置 frankenphp.yaml(位于项目根目录):
server:
document_root: public
index_files: [index.php]
rewrite:
- from: ^/(.*)
to: /index.php
status: 200
关键点:
-
document_root: public必须指定,不能省略或写成. -
rewrite规则必须存在,且status: 200表示内部重写(不是 HTTP 301 跳转) - 不要用
try_files风格语法——FrankenPHP 不识别 Nginx 配置项 - 改完后重启 FrankenPHP 进程(
frankenphp stop && frankenphp start)
Symfony 路由列表里有 /admin,但访问仍 404
说明请求已进 PHP,但 Symfony 没匹配到路由——常见于子目录部署、环境变量干扰或路由缓存未更新。
先验证路由是否真实加载:
- 运行
php bin/console debug:router,检查输出中是否有目标路径(注意大小写和末尾斜杠) - 若列表为空,执行
php bin/console cache:clear --env=prod(生产环境必须清缓存) - 检查
.env中是否误设了APP_ENV=dev但实际以 prod 模式运行,导致路由注册逻辑跳过 - 子目录部署(如
https://site.com/myapp/)时,必须在public/index.php开头手动设置:$_SERVER['SCRIPT_NAME'] = '/myapp/index.php';
另外注意:Symfony 默认不匹配带尾部斜杠的路径(/admin/),除非你在路由定义里显式加了 / 或启用了 strict_slashes: false。
API 接口返回 404,但日志显示请求进了 PHP
这往往是中间件或安全配置提前拦截了请求,而非路由未定义。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
典型原因:
-
security.yaml中的access_control规则拒绝了路径,返回 404 而非 403(例如path: ^/api但没给对应角色) - 自定义
Kernel::configureRoutes()里漏掉了$routes->import(...)导入 API 路由文件 - 使用了
attribute: true的路由,但控制器类没加@Route注解或命名空间路径不对 - PHP-FPM 用户权限不足,无法读取
config/routes/api.yaml文件(检查ls -l config/routes/权限)
快速定位:临时在 src/Kernel.php 的 configureRoutes() 方法开头加 file_put_contents('/tmp/route-debug.log', print_r($routes, true), FILE_APPEND);,再访问接口看日志里有没有对应路由。
FrankenPHP + Symfony 静态资源(CSS/JS)也 404
这不是路由问题,而是 FrankenPHP 没正确处理 public/ 下的静态文件优先级。
默认行为是:所有请求都走 rewrite 到 index.php,包括 /build/app.css——然后 Symfony 的 Asset 组件或 Webpack Encore 才接管,但生产环境通常禁用动态生成,所以返回 404。
修复方式是在 frankenphp.yaml 中为静态资源加白名单:
server:
document_root: public
index_files: [index.php]
rewrite:
- from: ^/(build|css|js|images)/.*
to: /$1
status: 200
- from: ^/(.*)
to: /index.php
status: 200
要点:
- 静态路径规则必须放在主 rewrite 规则之前(FrankenPHP 按顺序匹配)
- 路径名要和
public/下真实目录名完全一致(build≠dist) - 确保这些目录下文件确实存在,且 Web 用户(如
www-data)有读取权限
复杂点在于:FrankenPHP 的 rewrite 不支持正则捕获组重用(如 $1 在 to: 里只是字面量),所以上面示例仅适用于固定前缀;若需更灵活匹配,得靠 Symfony 的 assets 配置或前置 Nginx 代理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










