ThinkPHP 6.2 API 404主因是请求未进入框架,根本原因是Nginx未通过try_files将非静态请求转发至public/index.php统一入口,导致路由系统未启动;需确认root指向public目录、try_files配置正确、路由缓存已清除、url_route_must未误启、控制器命名空间大小写准确。

ThinkPHP 6.2 安装后 API 接口直接 404,基本不是路由没写,而是请求根本没进框架——绝大多数情况是伪静态规则缺失或 Nginx/Apache 配置没把请求正确转发给 public/index.php。
为什么Nginx配置里必须加try_files?
TP6 要求所有请求都经由 public/index.php 入口统一调度,否则路由无法识别。如果你用的是默认 Nginx 配置(比如宝塔一键部署),它可能只配了 root 指向 public,但没加路径回退逻辑。
常见错误现象:/api/v1/users 返回 404,但 /public/index.php/api/v1/users 能正常响应
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确认 Nginx server 块中包含这行:
try_files $uri $uri/ /index.php?$query_string; - root 必须指向项目根目录下的
public子目录,不是项目根目录本身 - 如果用了子目录部署(如
example.com/app/),try_files后面要改成/app/index.php?$query_string,并确保public/.htaccess(Apache)或 location 块(Nginx)已适配
为什么路由定义了还是 404?
TP6.2 默认关闭 url_route_must,但若你在 config/route.php 里手动开启或用了闭包路由未显式注册,会导致非定义路由全部被拦截为 404。
使用场景:你写了 Route::get('api/user', 'Api/UserController@index'),但访问时仍 404
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 检查是否在
route/app.php中误加了'url_route_must' => true—— 开启后所有请求必须命中路由定义,否则直接 404 - 确认控制器命名空间和类名拼写正确:
app\controller\Api\UserController,不是App\Controller\Api\UserController(大小写敏感) - 运行
php think route:list查看当前有效路由,确认你的接口 URL 确实出现在列表中
为什么API路由加了前缀还是 404?
TP6 的路由分组前缀(如 Route::group('api', function () {...}))不会自动添加到 URL 解析链路中,它只影响定义时的匹配逻辑;但如果入口文件或服务器配置把 /api/ 当作真实路径处理,框架反而会多截一层,导致匹配失败。
参数差异:Route::group('api', ...) 是逻辑前缀,不是物理路径前缀
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 不要在 Nginx 的
location块里单独为/api/写一个不带try_files的规则(例如location /api/ { ... }),这会让请求绕过主入口 - 若需强制所有 API 走
/api/开头,应在路由分组中定义,并确保 Nginx 仍走统一入口,不额外截断 - 检查
config/app.php中'app_host' => ''是否为空 —— 若填了域名但实际访问用的是 IP 或其他域名,也可能触发路由不匹配
最容易被忽略的一点:TP6.2 默认启用「路由缓存」,但开发阶段你改了路由却没清缓存,php think route:clear 这条命令不是可选项,是必跑项。缓存不清理,新写的路由永远不生效,连调试日志都不会打出来。



















