You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel API使用Fetch发送POST请求出现419状态错误的解决咨询

解决Laravel API POST请求返回419状态码的问题

419状态码确实和Laravel的CSRF保护相关,但你说的“API不需要CSRF令牌”是正确的——Laravel默认对routes/api.php中的路由不启用CSRF验证。出现这个问题通常有以下几个原因和对应解决方法:

1. 路由错误地放在了web.php中

Laravel的web.php路由默认使用web中间件组,其中包含VerifyCsrfToken中间件,会强制验证CSRF令牌;而api.php路由使用api中间件组,默认没有CSRF验证机制。

解决方法:
确认你的POST /api/products路由定义在routes/api.php中,示例代码:

// routes/api.php
Route::post('/products', [ProductController::class, 'store']);

2. API路由被手动添加了CSRF验证中间件

检查app/Http/Kernel.php中的api中间件组,确保没有包含VerifyCsrfToken中间件:

// app/Http/Kernel.php
protected $middlewareGroups = [
    'api' => [
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    // 其他中间件组...
];

3. 强制保留在web路由中(不推荐)

如果因特殊需求必须把路由放在web.php中,可以在CSRF验证中间件里排除该路由:
修改app/Http/Middleware/VerifyCsrfToken.php的$except数组:

// app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
    '/api/products',
];

补充:同域场景下的令牌携带方案

如果前端是Laravel Blade渲染的同域项目,也可以通过携带CSRF令牌解决问题:
首先在HTML模板中添加meta标签:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后修改fetch请求的headers:

fetch('http://127.0.0.1:8000/api/products', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
    },
    body: JSON.stringify(productData),
})

内容的提问来源于stack exchange,提问作者Shidou Ichijou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:11:06