frankenphp路由返回404,通常因请求未进入index.php:先确认nginx root指向public/目录,再检查location /中try_files $uri $uri/ /index.php?$query_string配置是否完整,最后验证index.php可执行且无前置输出。

FrankenPHP 访问路由返回 404,通常不是页面真丢失,而是请求根本没进 PHP 入口(如 index.php),被 Web 服务器直接判为“找不到资源”。这和传统 Nginx + PHP-FPM 场景类似,但 FrankenPHP 作为 SAPI 运行模式更轻量,依赖正确的 URL 重写规则把所有动态请求兜底转发给 index.php 处理。重点不在“跳转”,而在“不丢请求”。
确保 public/ 是 Web 根目录
FrankenPHP 要求 Web 服务器的 root 必须指向项目 public/ 目录(不是项目根目录)。例如:
- ✅ 正确:
root /var/www/myapp/public; - ❌ 错误:
root /var/www/myapp;
如果 root 设错,连/index.php都 404,后续重写无从谈起。确认后用curl -I http://localhost/index.php测试是否返回200。
Nginx 中配置 try_files 重写规则
FrankenPHP 官方推荐在 location / 块中使用 try_files,确保非静态资源全部交由 index.php 路由分发:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
⚠️ 注意:
- 不要漏掉
$uri/(支持目录访问); -
?$query_string必须保留,否则 GET 参数丢失; - 若你用的是 FrankenPHP 的
frankenphp.yaml(Docker 或 CLI 模式),该规则仍需写在 Nginx 配置里,FrankenPHP 自身不处理重写。
检查 index.php 是否可执行且无输出前置
在 public/index.php 开头临时加一行:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
<?php header('X-Test: hit'); die('ok');然后访问任意路径(如 /test)。若返回 ok 且响应头含 X-Test: hit,说明重写生效;若仍 404,问题一定出在 Nginx 配置或 root 路径。
静态资源别被 index.php 拦截
确保 location ~ \.(js|css|png|jpg|gif|ico|woff2)$ 类规则放在 location / 之前,优先匹配并直接返回文件,避免误入 PHP 处理。例如:
location ~* \.(js|css|png|jpg|gif|ico|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}可选:启用 FrankenPHP 内置的 fallback 路由(v1.1+)
如果你用的是较新版本 FrankenPHP(≥ v1.1),可在 frankenphp.yaml 中启用:
server: fallback: /index.php
这相当于服务端兜底,但不能替代 Nginx 的 try_files,仅作补充。主逻辑仍应由 Web 服务器完成重写,保障性能与兼容性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










