Laravel 11 中 web 和 api 中间件组必须在 bootstrap/app.php 的 withMiddleware() 中显式声明,否则路由引用会报错;routes.php 是唯一默认路由入口,需手动引入 web.php/api.php 并用 middleware('api') 包裹;web 组启用 session/CSRF,api 组无状态专用于 JSON 接口。

在 Laravel 11 中,web 和 api 中间件组不再通过 app/Http/Kernel.php 定义,而是统一收口到 bootstrap/app.php 的 ->withMiddleware() 闭包中。配置错误会导致路由直接报错,比如 Middleware group [api] does not exist。
必须在 bootstrap/app.php 中显式声明中间件组
打开 bootstrap/app.php,在 ->withMiddleware() 闭包里用 $middleware->web() 和 $middleware->api() 显式注册:
-
$middleware->web(append: [EnsureEmailIsVerified::class])是合法写法,可追加自定义逻辑 -
$middleware->api()不能省略——哪怕你只用 web 路由,只要路由里写了Route::middleware('api'),就必须先声明该组 - 顺序影响执行:如需日志打在最前、权限校验居中、响应修饰在最后,就按这个顺序调用
prepend()或append() - 自定义中间件类名必须带完整命名空间,且确保已加载(运行
composer dump-autoload确认)
routes.php 是唯一默认路由入口
Laravel 11 不再自动加载 routes/web.php 或 routes/api.php。所有路由必须集中或手动引入到 routes.php:
- 在
routes.php中写require __DIR__.'/web.php';和require __DIR__.'/api.php'; -
api.php内部必须用Route::middleware('api')->group(...)包裹,不能只写Route::get(...) - 别忘了在
->withRouting()中指定路径,例如:using: __DIR__.'/../routes.php',否则整个路由系统不启动
web 与 api 组行为差异必须严格区分
两者底层机制不同,混用会引发 session 启动失败、CSRF 报错或 token 解析异常:
-
web 组 默认启用
StartSession和VerifyCsrfToken,依赖 PHP session 存储(文件/Redis),适用于带 Cookie、视图渲染的页面请求 -
api 组 跳过 session 和 CSRF,专为无状态 JSON 接口设计,认证靠 Token(如 Sanctum 的
X-Sanctum-Token或 Bearer header) - 不要把 API 路由写进
web.php,也不要在api.php里返回视图——职责错位会直接导致 419 或 401
注意 auth:api 不是 api 组的一部分
api 是中间件组(含限流、模型绑定),auth:api 是独立的认证中间件,注册在 $routeMiddleware 中:
- 登录/注册等开放接口应只套
api组(保障限流和绑定),不加auth:api - 需要鉴权的接口才叠加
->middleware('auth:api') - 混淆二者会导致认证跳过或 Token 校验失败


















