Laravel 11 路由分组中中间件不执行的根本原因是注册位置错误、未正确绑定或调用方式不当;需通过 route:list --middleware 验证实际加载结果,严格区分 $middleware、$middlewareGroups 和 $routeMiddleware 三层注册位置,并确保路由定义使用正确语法如 Route::middleware(['auth'])->group(...)。

中间件在 Laravel 11 路由分组中不执行,不是配置“没写”,而是没写对位置、没注册对地方、或没被真正绑定。定位要从命令行输出入手,再逐层验证注册与调用逻辑。
用 route:list 看真实绑定结果
这是最权威的依据,直接反映运行时实际生效的中间件链:
- 运行 php artisan route:list --middleware,检查目标路由的 Middleware 列是否包含你期望的中间件名(如 auth、admin)
- 若该列为空或缺失,说明中间件根本未被加载——不是路由写错,是注册或引用环节断了
- 注意:重复声明会被自动去重,只保留首次出现的位置;拼写大小写不一致(如 Auth vs auth)也会导致不匹配
查 Kernel.php 的三层注册位置
中间件必须落在正确的注册数组里,否则 Laravel 根本不会识别它:
- $middleware:全局中间件,所有请求都走。适合日志、CORS、维护模式等,不适合鉴权(会拦截 /health、静态资源)
- $middlewareGroups(如 web、api、自定义 admin):只对显式使用 ->middleware('admin') 或 Route::middleware('admin')->group() 的路由生效
- $routeMiddleware:仅当路由显式调用 ->middleware('check.role') 时才启用,且其在该数组中的声明顺序决定执行优先级
- 常见错误:把 AdminAuthMiddleware 错加到 $middleware,结果所有接口都被拦;或漏加 StartSession::class 到 admin 组,导致 session() 不可用
确认路由定义是否真正触发中间件
写法不对,Laravel 就当它不存在:
- ✅ 正确:Route::middleware(['auth'])->group(...) 或 Route::group(['middleware' => ['auth']], ...)
- ❌ 无效:Route::group(function () { middleware(['auth']); })(闭包内无此函数)
- ❌ 无效:Route::group(['prefix' => 'admin'], ['middleware' => ['auth']])(第二个数组被丢弃)
- 单个中间件也必须是数组:['auth'],不能写成 auth(PHP 报常量未定义)
- 嵌套分组不继承中间件:外层写了 auth,内层仍需显式声明,否则不执行
加日志确认中间件是否进入 handle()
理论不如实测,快速验证执行流:
- 在中间件 handle() 方法第一行加入:error_log('→ ' . class_basename($this) . ': ' . request()->path());
- 发起一次请求,查看 PHP 错误日志(如 storage/logs/laravel.log 或系统 error_log)
- 若无任何输出,说明该中间件未被加载或未被路由绑定;若有输出但逻辑未生效,再检查 return $next($request) 是否遗漏
- 避免用 dd(),它会中断整个中间件链,掩盖后续执行情况



















