Laravel 5.8生产环境POST请求遇CSRF Token Mismatch本地无此问题
解决Laravel生产环境POST请求CSRF Token Mismatch问题
嘿,这个问题我在生产环境踩过好几次坑了,别慌,咱们一步步排查解决:
检查APP_URL与域名一致性
先去生产环境的.env文件里确认APP_URL是不是和你实际访问的域名完全一致——比如你实际用https://yourapp.com访问,就不能写成http://yourapp.com或者带www的(如果实际域名不带的话)。Laravel生成CSRF Token时会依赖这个配置,Cookie的域名匹配不上就会导致Token无法正确验证。调整Session与Cookie配置
这是生产环境最容易出问题的地方:- 把
SESSION_DOMAIN设为你的根域名,比如.yourapp.com(前面的点很重要,能让子域名也共享Session),如果是单域名直接写yourapp.com就行 - 如果你用的是HTTPS(生产环境基本都是),一定要把
SESSION_SECURE_COOKIE设为true,这个选项控制Cookie只能通过HTTPS传输,没开的话很可能导致Cookie无法被正确保存 - 建议把
COOKIE_SAMESITE设为Lax,默认的Strict在某些跳转场景下会导致Cookie丢失;如果有跨域需求,可以设为None,但要配合SESSION_SECURE_COOKIE=true一起用
- 把
确认CSRF Token的正确传递
- 表单里要确保用了Laravel的
@csrfBlade指令,它会自动生成隐藏的Token输入框 - 如果是AJAX请求,记得先在页面头部添加Meta标签:
<meta name="csrf-token" content="{{ csrf_token() }}">,然后在请求头里带上Token:headers: {'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content},或者直接把Token放到请求参数里
- 表单里要确保用了Laravel的
清除生产环境的缓存
部署后一定要执行这些命令,把旧的配置和缓存清干净,不然.env的修改可能不会生效:php artisan config:clear php artisan cache:clear php artisan route:clear php artisan view:clear排查服务器/CDN缓存
如果你的网站用了CDN或者服务器端缓存(比如Nginx的proxy_cache),要确保包含CSRF Token的动态页面没有被缓存——用户拿到旧的Token自然会匹配失败。可以在Nginx配置里给动态路由添加禁止缓存的规则,或者在CDN后台排除这些动态路径。检查浏览器Cookie设置
让测试的用户确认浏览器是否允许你的网站保存Cookie,尤其是如果有跨域场景的话,第三方Cookie的权限也要打开(不过生产环境一般都是同域,主要看是否禁用了Cookie)
内容的提问来源于stack exchange,提问作者Jofie Bernas
相关产品推荐
相关产品推荐

