Laravel 11 的全局中间件统一配置在 bootstrap/app.php 的 withMiddleware() 中,通过 $middleware->use([...]) 显式声明,按顺序执行洋葱模型,覆盖所有请求,适用于信任代理、CORS、Cookie 加密、Session、CSRF、路由绑定等基础设施逻辑。

在 Laravel 11 中,全局中间件不再写在 app/Http/Kernel.php(该文件已被移除),而是统一收口到 bootstrap/app.php 文件中的 withMiddleware() 配置闭包里。use() 方法就是用来定义「每次 HTTP 请求都必须经过」的最外层中间件栈——也就是真正意义上的全局中间件。
你不需要手动分组、也不依赖 $middlewareGroups,所有全局执行逻辑都通过 $middleware->use([...]) 显式声明。
use() 方法注册的是最外层中间件
这个数组里的中间件会包裹整个应用请求生命周期,顺序执行:
- 请求进来时,从上到下依次进入;
- 响应返回时,从下到上依次退出(洋葱模型)。
例如,在 bootstrap/app.php 中:
->withMiddleware(function (Middleware $middleware) {
$middleware->use([
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\HandleCors::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
]);
})
✅ 这些中间件对 所有 HTTP 请求生效(包括 /api/*、/web/*、甚至 /health 等),适合放基础支撑类逻辑:
- 代理信任与 HTTPS 强制
- 跨域头设置(CORS)
- Cookie 加密与解密
- Session 初始化
- CSRF 验证(注意:Laravel 11 的
web组不再内置它,需手动加) - 路由参数绑定
⚠️ 注意顺序不能乱:
-
EncryptCookies必须在StartSession之前(否则 session 数据无法解密) -
StartSession必须在VerifyCsrfToken之前(否则 token 验证失败) -
SubstituteBindings通常放最后,确保路由模型绑定可用
web() 和 api() 不是全局中间件,而是分组占位符
它们不自动添加任何中间件,只是为后续路由分组提供语义标识:
$middleware->web([ /* 可为空,或只加 web 特有中间件 */ ]); $middleware->api([ /* 同理,不包含 auth/session/CSRF */ ]);
这些数组内容不会影响 use() 定义的全局栈,仅用于你在 routes/web.php 或 routes/api.php 中调用 Route::middleware('web') 时被引用(底层由框架自动匹配)。
别把本该全局的中间件错放到 web() 或 api() 里
比如日志记录、请求 ID 注入、安全响应头(如 X-Content-Type-Options),应该进 use();
而 auth、throttle、verified 这类业务相关中间件,不属于全局范畴,必须走 alias() + 路由显式调用。
简单说:
- ✅
use([])→ 所有请求必经的“基础设施层” - ❌ 不要往
web()/api()里塞加密、session、CSRF —— 它们已由use()提供,重复加会导致冲突或失效 - ? 顺序即执行顺序,改位置前先想清依赖关系
不复杂但容易忽略。











