Laravel 8.x 区分 Web 和 API 请求取决于路由定义位置及中间件组绑定方式:web 路由在 routes/web.php 中需显式绑定 web 中间件组(含 session、CSRF 等),而 api 路由在 routes/api.php 中默认自动绑定 api 中间件组(无状态、限流、模型绑定,无 session/CSRF)。

Laravel 8.x 区分 Web 和 API 请求,核心不在于「请求来源」,而在于路由定义位置 + 中间件组绑定方式。系统本身不会自动识别浏览器还是 Postman 发的请求,而是靠你如何组织路由和中间件。
Web 请求走 web 中间件组
所有在 routes/web.php 中定义的路由,默认不自动生效 web 组中间件;必须显式绑定 web 中间件组,才能启用 session、CSRF、错误共享等能力。常见写法有:
-
使用
Route::middleware('web')Route::middleware('web')->group(function () { Route::get('/dashboard', [DashboardController::class, 'index']); Route::post('/comment', [CommentController::class, 'store']); }); -
或直接用
Route::group声明(效果等同)Route::group(['middleware' => 'web'], function () { // ... });
web 组默认包含:
-
EncryptCookies -
StartSession(启用会话) -
ShareErrorsFromSession -
VerifyCsrfToken(校验 CSRF token) -
SubstituteBindings
✅ 适合带登录态、页面跳转、表单提交的传统 Web 应用。
API 请求走 api 中间件组
所有在 routes/api.php 中定义的路由,默认已自动绑定 api 中间件组(由 RouteServiceProvider 的 mapApiRoutes() 方法自动完成),无需手动加 ->middleware('api')。
它的典型配置是:
'api' => [
'throttle:60,1',
'bindings',
],⚠️ 注意:
-
api组不含 session、无 CSRF、无 cookie 加密,是无状态设计; - 路径自动带
/api/前缀(如GET /api/users); - 不支持
auth()->user()直接取会话用户,需配合auth:api等守卫中间件做 Token 验证。
别混淆 api 和 auth:api
-
'api'是中间件组,管通用请求处理(限流、模型绑定); -
'auth:api'是路由级中间件,从$routeMiddleware['auth']派生,专用于校验 API Token(如 Sanctum、Passport),需手动添加:Route::get('/profile', [ProfileController::class, 'show'])->middleware('auth:api');
如何确认当前请求走的是哪一组?
- 查请求 URL:以
/api/开头 → 极大概率走api组;否则看是否在web.php里且绑定了web; - 在中间件
handle()里dd($request->route()->getActionName(), $request->middleware());可直观看到激活的中间件列表; -
dd(app('router')->current()->middleware());也能查当前路由实际加载的中间件。
不复杂但容易忽略


















