中间件失效主因是请求未抵达,须按注册位置、调用方式、执行逻辑三环节排查:先查kernel.php中全局/分组/路由级注册是否正确,再通过日志验证handle()是否触发,最后确认$next($request)是否被return及顺序是否合理。

中间件失效不是“没起作用”,而是请求根本没走到它那里——常见原因集中在注册位置、调用方式、执行逻辑三个环节。下面按排查优先级给出实用方案。
确认中间件是否被正确注册和挂载
中间件必须被显式挂到某个“管道”里才会运行。打开 app/Http/Kernel.php,检查三类注册位置:
- 全局中间件($middleware):对所有请求生效,比如日志、CORS。误放鉴权中间件到这里,会导致静态资源或健康检查也被拦截
-
中间件组($middlewareGroups):如
web或api组。你的路由必须属于该组(例如用Route::middleware('web')或定义在routes/web.php中),中间件才生效 -
路由级中间件($routeMiddleware):只在你主动调用时才启用,比如
->middleware('auth.api')。写了类但没在路由里加这行,等于没注册
验证中间件是否实际触发
在中间件 handle() 方法开头加一行调试日志:
Log::debug('CheckAdmin middleware hit', ['uri' => $request->getRequestUri()]);
然后访问对应路由,再查 storage/logs/laravel.log。如果没这条日志,说明中间件压根没被调用;如果有,说明它执行了,问题出在内部逻辑(比如判断条件写错、提前 return 了但没返回响应)。
检查 handle() 方法是否合规放行
Laravel 中间件是洋葱模型,$next($request) 必须被 return,否则请求会卡死:
- ❌ 错误:
$next($request);(没 return,后续控制器不执行) - ✅ 正确:
return $next($request); - ✅ 重定向:
return redirect('/login'); - ✅ 返回错误:
return response()->json(['error' => 'Forbidden'], 403);
特别注意:任何提前终止逻辑(如权限拒绝)都必须有明确的 return,不能只写 redirect() 而漏掉 return。
排查中间件顺序与冲突
中间件顺序决定执行时机。比如 CORS 中间件如果放在 StartSession 之后,可能因 session 启动失败而跳过;如果放在认证中间件之后,预检请求(OPTIONS)可能被直接拒掉。
执行命令查看当前路由绑定的中间件:
php artisan route:list --path=/your-route
确认输出中 Middleware 列是否包含你期望的中间件名。如果缺失,说明注册或调用有误;如果存在但没生效,重点查它的前后依赖项是否阻断了流程。











