Laravel 5.5 POST请求遇419过期错误,资源控制器存储数据失败求助
Hey there, let's break down why you're hitting that 419 "Page Expired" error and how to fix it:
问题根源
这个419状态码是Laravel的CSRF(跨站请求伪造)保护机制在生效——当POST请求没有携带有效的CSRF令牌,或者令牌验证失败时,Laravel就会抛出这个错误。你提到GET请求正常、非资源控制器的POST也失效,说明这是全局的CSRF验证相关问题,不是资源路由本身的配置错误。
具体解决步骤
1. 确认CSRF令牌正确渲染到表单中
你用了{{ csrf_field() }},这在Laravel 5.5里是有效的,但建议检查页面源码,确认表单里是否生成了如下格式的隐藏字段:
<input type="hidden" name="_token" value="你的令牌值">
如果没有生成,可能是Blade模板解析的问题,你可以换成Laravel 5.5支持的@csrf指令试试,效果是一样的:
<form action="/post" method="POST"> @csrf <!-- 其他表单字段 --> </form>
2. 检查会话目录的权限
Laravel的会话默认存在storage/framework/sessions目录下,如果这个目录没有写入权限,会话无法正常保存,CSRF令牌的验证就会失败。执行以下命令设置正确的权限:
chmod -R 755 storage/ chown -R www-data:www-data storage/ # 如果你用的是Nginx/Apache的www-data用户
3. 确保路由在web中间件组内
Route::resource默认会自动归到web中间件组里(这个组包含了会话管理和CSRF验证的中间件),但如果你手动修改过路由文件,要确认你的资源路由没有被放到api中间件组里。打开routes/web.php,确保你的路由是在这里定义的:
// routes/web.php Route::resource('post', 'Post\PostController');
4. 清除配置和缓存
有时候缓存的配置会导致会话或CSRF验证异常,运行以下命令清除缓存:
php artisan config:clear php artisan cache:clear
另外,你可以手动删除storage/framework/sessions目录下的所有文件,清空旧的会话数据。
5. 检查VerifyCsrfToken中间件的例外设置
打开app/Http/Middleware/VerifyCsrfToken.php,确认$except数组里没有包含/post——如果加了例外,理论上不会报错,但反过来,如果你的请求不在例外里,就必须携带令牌。不过你的情况是带了令牌仍报错,这条可以作为排查项。
额外说明
GET请求不需要CSRF验证,所以你切换成GET后能正常运行,但POST请求(不管是资源控制器还是普通控制器)都必须通过CSRF验证,这就是为什么非资源控制器的POST也失效的原因。
内容的提问来源于stack exchange,提问作者LTM

