中间件不生效通常因请求未到达,需按注册、触发、执行顺序排查:检查Kernel.php中全局/分组/路由级注册是否正确,加日志验证是否执行,确保handle()中$next($request)或终止响应均return,注意中间件顺序及依赖关系。

中间件不生效,通常不是“没运行”,而是请求压根没走到它那里。排查要从注册、触发、执行三个环节入手,按顺序验证才高效。
确认中间件是否被正确挂载
打开 app/Http/Kernel.php,检查三类注册位置:
- 全局中间件($middleware):对所有请求生效。别把 auth 或权限类放这里,否则静态资源、健康检查接口也会被拦截
-
中间件组($middlewareGroups):比如
web或api组。你的路由必须属于该组——要么定义在routes/web.php,要么显式调用Route::middleware('web') -
路由级中间件($routeMiddleware):只在你主动调用时启用,例如
->middleware('auth.api')。写了类但没在路由里加这行,等于没注册
验证中间件是否实际执行
在中间件的 handle() 方法开头加一行日志:
Log::debug('MyMiddleware hit', ['uri' => $request->getRequestUri()]);访问对应路由后,去 storage/logs/laravel.log 查看是否有这条记录:
- 没有日志 → 中间件未被调用,问题出在注册或路由匹配环节
- 有日志但逻辑没生效 → 检查内部判断条件(如
$request->user()是否为 null)、是否提前 return 错误响应、或被语言包/配置覆盖
检查 handle() 是否合规放行
Laravel 中间件是洋葱模型,$next($request) 必须被 return,否则请求会卡死:
- ❌ 错误写法:
$next($request);(没 return,控制器永远不会执行) - ✅ 正确写法:
return $next($request); - ✅ 提前终止也必须 return:
return redirect('/login');或return response()->json(..., 403);
漏掉 return 是高频低级错误,尤其在权限拒绝分支里只写了 redirect() 却忘了前面加 return。
排查顺序与依赖冲突
中间件顺序决定执行时机,错位会导致跳过或失效:
- 执行命令查看当前路由绑定的中间件:
php artisan route:list --path=/your-route,确认 Middleware 列是否含目标中间件名 - CORS 中间件必须放在
StartSession之前,否则 session 启动失败会跳过它 - 认证中间件(如
Authenticate)应早于角色校验(如CheckRole),否则用户未登录就进不了角色判断 - 若使用
$middlewarePriority,确保关键中间件(如 Session、Auth)排在靠前位置











