Laravel 11 中全局中间件必须在 bootstrap/app.php 的 withMiddleware() 中显式声明:$middleware->use() 用于全请求链,$middleware->web([]) 和 $middleware->api([]) 替代旧版中间件组,不再支持 app/Http/Kernel.php。

在 Laravel 11 中,把中间件设为全局生效,必须通过 bootstrap/app.php 文件中的 withMiddleware() 配置完成,不再使用旧版的 app/Http/Kernel.php。这是框架的重大变更,直接沿用老方法会启动失败或静默不生效。
在 bootstrap/app.php 中注册全局中间件
打开 bootstrap/app.php,找到 ->withMiddleware() 闭包。所有全局中间件都必须在这里显式声明:
-
$middleware->use([\App\Http\Middleware\ForceHttps::class]):添加到每个请求最外层执行链,适合安全头、日志、跨域等通用逻辑 -
$middleware->web([]):替代旧版web中间件组,传入数组(可为空),用于 web 路由链;注意它不包含认证逻辑 -
$middleware->api([]):同理,用于 API 路由链,也不含 auth 或 session 支持
别名不是必须的,但路由中间件需单独处理
全局中间件不需要 alias,直接用类名即可。但如果你还想在某些路由上单独加中间件(比如 auth、throttle),则必须额外注册别名:
- 在同一个
withMiddleware()里调用$middleware->alias('auth', \App\Http\Middleware\Authenticate::class) - 然后才能在路由中写
->middleware('auth'),否则会报 “Undefined middleware” - 未 alias 的类全名(如
\App\Http\Middleware\Authenticate::class)不能直接传给->middleware()
验证是否生效的几个关键点
配置完别急着刷新页面,先确认以下几项:
- 运行
php artisan route:list,检查目标路由是否显示你期望的中间件(全局中间件不会逐条列出,但可通过请求日志或 dd() 在 handle 开头验证) - 在中间件的
handle()方法第一行加dd('global middleware hit');,访问任意 HTTP 路由(包括 / 、/health 等)看是否触发 - 确保中间件类存在且
handle()方法末尾有return $next($request);,漏掉会导致请求挂起 - Artisan 命令、队列任务、WebSocket 连接不走这个中间件栈,只对标准 HTTP 请求生效
常见错误写法(Laravel 11 中已失效)
这些操作在 Laravel 11 下要么报错,要么完全不执行:
- 还在
app/Http/Kernel.php里写$middleware = []→ 文件已被移除,PHP 解析失败 - 试图在
config/app.php的 providers 里重复注册RouteServiceProvider→ 报 “Provider already registered” - 沿用
Route::group(['middleware' => 'web'], ...)却没提前 alias → 中间件不执行,且route:list不报错也不显示 - 把带参数的中间件(如
throttle:60,1)塞进$middleware->web([...])→ 不支持,只能单独绑定到路由


















