Laravel 11 中无默认中间件组,web/api 组必须在 bootstrap/app.php 的 withMiddleware() 中显式声明,否则调用即报错;未声明即不存在,而非被移除或替换。

Laravel 11 中没有“默认中间件组”自动加载机制,web 和 api 组都不再内置,也不再预设任何执行逻辑。所谓“移除或替换默认中间件”,本质是:你根本没注册过它们——所以不是删,而是**不声明、不调用、或显式覆盖**。
不再存在默认中间件组
旧版 Laravel 的 app/Http/Kernel.php 中定义的 $middlewareGroups(如 web、api)在 Laravel 11 中已被完全移除。框架本身不提供任何预置中间件组,也不会自动挂载 session、csrf、auth 等逻辑到某个组里。
- 如果你没在
bootstrap/app.php的withMiddleware()中调用$middleware->web([...])或$middleware->api([...]),那Route::middleware('web')就会直接报错:Middleware group [web] does not exist - 这意味着:不存在需要“移除”的默认中间件;只有你主动注册的,才存在、才生效
如何跳过某类中间件(比如不走 auth)
常见场景是让某些路由公开访问,避免被认证中间件拦截。关键不是“移除默认”,而是**不把认证中间件加进去**:
- 不要在路由中写
->middleware('auth')或->middleware(['web', 'auth']) - 不要在
withMiddleware()中给web组塞入Authenticate::class或类似逻辑 - 若已注册了全局
auth中间件(如通过$middleware->use(...)),而只想对个别路由绕过,Laravel 11 不支持except()语法;应改用独立路由定义,避开该中间件链
如何替换中间件行为(例如自定义 session 或 csrf)
所有中间件都必须显式注册并控制顺序。想“替换”,就是换掉原来的类,或调整执行位置:
- 在
bootstrap/app.php的withMiddleware()中,用$middleware->use([...])替换全局中间件列表 - 用
$middleware->web([...])完全自定义 web 组内容,例如:$middleware->web([StartSession::class, EncryptCookies::class, VerifyCsrfToken::class])
——不包含Authenticate::class,就自然没有登录校验 - 若要替换某中间件(如用自定义
CustomCsrfVerifier替代原生VerifyCsrfToken),只需在数组中替换成你的类名即可
注意迁移时的常见误操作
升级到 Laravel 11 后,很多报错源于“以为默认还在”:
- 沿用旧路由写法
Route::middleware('api')->group(...),但没在withMiddleware()里声明$middleware->api()→ 报错 - 以为
web组自带认证,结果没注册Authenticate,导致所有页面都免登录 → 实际是“什么都没配”,不是“默认被移除” - 在
AppServiceProvider::boot()里尝试动态添加中间件 → 不生效,必须在bootstrap/app.php显式注册











