laravel 中 web.php 和 api.php 路由本质不同:web 路由启用 session、csrf、重定向和 html 响应,api 路由无 session、免 csrf、返回 json 且禁用重定向。

不一样。Laravel 对接口请求(api.php)和页面请求(web.php)的处理方式从中间件、会话、CSRF 防护到响应格式都做了明确区分,不是“写法相似就等价”。
中间件栈完全不同
这是最根本的区别。Laravel 默认为两类路由加载了不同的中间件组:
-
web路由自动应用EncryptCookies、StartSession、VerifyCsrfToken等中间件,依赖 session 和 cookie; -
api路由默认只走ThrottleRequests和状态无感知的中间件,不启动 session,也不校验 CSRF token。
如果你在 api.php 里调用 Auth::user() 却没登录,它不会像 web 路由那样跳转到登录页——而是直接返回 null,因为 session 根本没初始化。
CSRF token 处理逻辑相反
页面请求必须带有效 CSRF token(否则 POST/PUT/PATCH/DELETE 会被 VerifyCsrfToken 拦截),而接口请求默认绕过这层校验:
- 前端用 Blade 表单提交?必须加
@csrf; - 前端用 Axios 请求
/api/posts?不需要传X-CSRF-TOKEN,传了也无效; - 如果硬要在 API 路由里启用 CSRF,得手动在
app/Http/Kernel.php的$middlewareGroups['api']里加App\Http\Middleware\VerifyCsrfToken::class,但通常不推荐。
响应格式与错误处理默认不同
即使控制器代码一模一样,web 和 api 路由返回的内容结构也不同:
-
web路由中return view('welcome')返回完整 HTML;抛出ModelNotFoundException会渲染 404 Blade 页面; -
api路由中同个异常默认返回 JSON:{"message":"No query results for model [App\Models\Post] 123"}; -
response()->json()在web路由里也能用,但浏览器会显示原始 JSON 字符串,而不是跳转或渲染页面; - API 响应还默认禁用重定向:你在
api.php里写return redirect('/home'),它不会跳转,而是返回一个含Locationheader 的 302 响应体——前端 JavaScript 必须自己解析并跳转。
别把 Inertia 混进来当“第三种路由”
Inertia 路由虽然定义在 routes/web.php,但它本质是 web 路由 + 特殊响应格式(首次 HTML,后续 JSON)。它不等于 API 路由:
- Inertia 控制器仍走
web中间件栈,有 session、CSRF、重定向能力; - Inertia 响应靠
Inertia::render(),不是response()->json(); - 你不能在
api.php里用Inertia::render(),会报错,因为它依赖 session 和视图引擎。
真正容易被忽略的是:路由文件位置(web.php 或 api.php)只是入口,决定中间件和默认行为;但最终怎么响应,取决于你控制器里写的那行 return —— 写错地方,比如在 API 路由里返回 view(),或者在 Web 路由里忘了处理验证失败的重定向,问题就会立刻暴露。











