
laravel 默认将未认证请求重定向至登录页,导致 api 调用抛出路由异常;只需在请求头中添加 accept: application/json,即可触发框架返回标准 json 错误响应(如 401 unauthorized),无需修改中间件或控制器逻辑。
在 Laravel API 开发中,当你使用 Sanctum(或 Passport)保护路由(如 Route::middleware('auth:sanctum'))时,框架底层仍沿用 Web 认证的异常处理机制:未通过认证的请求会被重定向到 login 路由。但由于你的项目是纯 API(无 web 中间件组、未定义 login 命名路由),此重定向会触发 RouteNotFoundException,而非预期的 JSON 错误响应。
根本原因在于 Laravel 的认证守卫(Guard)根据请求的 Accept 请求头决定响应格式:
- 若 Accept: text/html(浏览器默认)→ 尝试重定向 → 报错;
- 若 Accept: application/json(API 客户端显式声明)→ 直接返回 401 Unauthorized JSON 响应。
✅ 正确解决方案(无需改代码):
在 Postman(或任意 HTTP 客户端)中,为所有受保护的 API 请求(如 GET /api/movies)手动添加请求头:
Accept: application/json Authorization: Bearer your-token-here // 认证时才需此项
此时,当 Token 缺失、过期或无效时,Laravel 将自动返回标准化 JSON 响应:
{
"message": "Unauthenticated."
}HTTP 状态码为 401 Unauthorized,符合 REST API 规范。
⚠️ 注意事项:
- 不要尝试在 api.php 中用 Auth::check() 手动拦截 —— 这绕过了 Sanctum 的守卫机制,且无法统一处理 Token 解析、刷新等逻辑;
- 不要重写 Authenticate 中间件(App\Http\Middleware\Authenticate)—— Laravel 10+ 已内置对 Accept: application/json 的智能响应支持;
- 确保 config/auth.php 中 sanctum guard 的 provider 配置正确指向 users 模型;
- 若使用自定义异常处理(app/Exceptions/Handler.php),可进一步优化 JSON 错误结构,但非必需:
// app/Exceptions/Handler.php
public function render($request, Throwable $exception)
{
if ($exception instanceof AuthenticationException && $request->expectsJson()) {
return response()->json(['message' => 'Unauthorized'], 401);
}
return parent::render($request, $exception);
}总结:Laravel API 认证的“静默重定向”行为是设计使然,而非缺陷。显式声明 Accept: application/json 是告诉框架“我是一个 API 客户端,请用 JSON 响应错误”,这是最轻量、最符合 Laravel 惯例的解决方案。 在前端 Axios/Fetch 或移动端 SDK 中,也务必全局设置该请求头,确保一致性。










