Laravel中使用CURL发起POST请求遇页面过期错误的解决咨询
嘿,我来帮你搞定这个“页面因闲置过期”的问题!这个错误本质就是Laravel的CSRF保护机制在拦截你的请求——因为你没带上和Session绑定的有效Token,或者Token的传递方式不对。下面一步步教你正确配置:
核心原理先搞懂
Laravel的CSRF Token是和用户Session绑定的,所以光传Token不行,还得带上对应的Session Cookie,不然Laravel没法验证这个Token是不是属于当前会话的。
步骤1:先获取Session Cookie和CSRF Token
Laravel自带了一个专门用来获取CSRF Token的路由/csrf-cookie,用它来拿到Session和Token的Cookie:
curl -c cookies.txt http://localhost:8000/csrf-cookie
这里的-c cookies.txt是把响应里的Cookie(包括Session ID和XSRF-TOKEN)保存到本地的cookies.txt文件里,后面的请求必须带上这个文件里的Cookie。
步骤2:提取有效的CSRF Token
你可以直接查看cookies.txt里的XSRF-TOKEN值,或者用命令快速提取(注意Cookie里的Token是URL编码的,要转成正常格式):
cat cookies.txt | grep XSRF-TOKEN | awk '{print $7}' | sed 's/%3D/=/g'
执行完这个命令会输出解码后的Token,把它记下来。
步骤3:带着Cookie和Token发送POST请求
Laravel默认会识别X-XSRF-TOKEN请求头(对应Cookie里的XSRF-TOKEN),所以你的CURL命令要改成这样:
curl -b cookies.txt -H "X-XSRF-TOKEN: 刚才提取的Token值" -X POST -d '{"data": "你的请求数据"}' http://localhost:8000/api
重点提醒:
-b cookies.txt必须加,用来带上之前获取的Session Cookie,否则Token验证会失败- 头字段的格式要规范,冒号后面不要加多余空格(比如你原来的
X-CSRF-TOKEN : token里的空格会导致识别错误) - 如果你的请求是表单格式(不是JSON),也可以在请求体里加
_token=你的Token值,比如:curl -b cookies.txt -X POST -d '_token=刚才提取的Token值&data=你的请求数据' http://localhost:8000/api
额外注意点
如果你的API路由是放在routes/api.php里的,默认Laravel的api中间件组是没有启用CSRF保护的,如果你还遇到这个错误,大概率是:
- 你把API路由误放在了
routes/web.php里(web路由默认启用CSRF保护) - 你手动给API路由添加了
VerifyCsrfToken中间件
如果不需要在API里启用CSRF保护,把路由移到routes/api.php就行;如果确实需要启用,就按上面的步骤来。
内容的提问来源于stack exchange,提问作者Sagar Shinde

