Laravel Sanctum本地运行正常 部署Heroku后出现419 CSRF token mismatch错误
问题排查及解决方案
核心原因
herokuapp.com属于浏览器公共后缀列表(Public Suffix List)中的域名,浏览器不允许跨二级子域设置/共享Cookie,你原本预期的同根域Cookie共享逻辑在此场景下不生效,是导致419 CSRF报错的核心诱因。
修复步骤
1. 调整生产环境.env配置
替换原有配置为以下值:
SESSION_DRIVER=cookie SESSION_SECURE_COOKIE=true SESSION_DOMAIN=school-back-v2.herokuapp.com SANCTUM_STATEFUL_DOMAINS=react-protected-routes.herokuapp.com
注意事项:
SANCTUM_STATEFUL_DOMAINS仅填写前端域名,不要加HTTP/HTTPS前缀、不要加端口- 不要将
SESSION_DOMAIN设置为.herokuapp.com,该配置会被浏览器拦截 SESSION_SECURE_COOKIE必须设为true,Heroku生产环境全站走HTTPS,安全Cookie是必填项
2. 校验CORS配置(config/cors.php)
确保配置满足以下要求:
supports_credentials设为trueallowed_origins明确填入前端完整域名https://react-protected-routes.herokuapp.com,禁止使用通配符*paths数组包含sanctum/csrf-cookie和你的API路由前缀,例如api/*
3. 前端请求规则校验
- 全局开启请求凭证:给axios设置
axios.defaults.withCredentials = true - 所有需要鉴权的请求发送前,必须先调用GET请求
/sanctum/csrf-cookie获取CSRF Cookie,再发起后续业务请求
4. 生产环境缓存清理
部署完成后执行以下命令清理Laravel配置缓存:heroku run php artisan config:clear && php artisan config:cache
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

