ThinkPHP6路由报错需先区分是Web服务器404还是TP6路由错误页:前者说明请求未进入框架,需检查服务器根目录、重写规则及宝塔配置;后者表明已进框架,应核查路由定义、控制器继承与命名规范、缓存清理及中间件配置。

ThinkPHP6路由报错,多数不是语法写错,而是请求根本没进框架、路由没加载、或匹配逻辑被干扰。关键先分清是“Web服务器404”还是“TP6自己的路由错误页”,再针对性处理。
检查请求是否真正进入TP6框架
看到Nginx/Apache原生404(白页无调试信息),说明请求没到public/index.php。必须确认:
- Web服务器根目录设为项目根(如
/www/wwwroot/myapp),但运行目录必须选/public - Nginx配置中,
location /块要放在location ~ \.php$之前,并含重写规则:if (!-e $request_filename) { rewrite ^(.*)$ /public/index.php?s=$1 last; } - Apache下确保
public/.htaccess可读,且虚拟主机配置中AllowOverride All已开启 - 宝塔用户别直接套用“ThinkPHP”预设规则——它适配TP5,TP6需手动改写为带
/public/的路径
确认路由定义与加载无误
能看到TP6黄色错误页(如“当前访问路由未定义”),说明已进框架,问题出在路由层:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 检查
app/route/app.php是否用了use think\facade\Route;,漏引用会报Class 'Route' not found - 资源路由
Route::resource('users', 'Api/User')要放在所有通配符路由(如Route::any('{id}', ...))之前,否则被提前拦截 - 多应用模式下,路由文件需放在
app/route/[应用名]/,入口文件public/index.php要加$http->name('admin')->run() - 修改路由后必须清缓存:
php think route:clear,或临时关掉config/route.php里的'route_cache' => false
验证控制器与方法是否严格符合约定
资源路由或普通路由匹配失败,常因控制器签名不达标:
立即学习“PHP免费学习笔记(深入)”;
- 控制器类必须继承
think\Controller(不是think\BaseController) -
show($id)、update($id)等方法的参数名必须是$id;若用$uid,得显式绑定:->bind(['id' => 'uid']) - 文件路径
app/controller/Api/User.php、命名空间app\controller\Api\User、类名三者必须完全一致,Linux下大小写敏感 - 闭包路由记得返回内容,例如
function() { return 'ok'; },只echo会导致空响应,浏览器可能显示为404
排查中间件与跨域干扰
路由能匹配但行为异常(如中间件不执行、跨域头缺失),注意:
- 资源路由不支持链式
->middleware(),要用路由分组:Route::group(['middleware' => 'auth'], function () { Route::resource(...); }); - CORS跨域由
think\middleware\Cors控制,需在app/middleware.php中启用,且位置靠前;带cookie时origin不能用* - 如果用了反向代理(如Nginx前置),检查它是否过滤或覆盖了响应头
- 关闭
APP_DEBUG = false时,中间件异常可能静默失败,建议调试阶段保持开启


















