Laravel生产环境AJAX登录报CSRF TOKEN MISMATCH错误求解
Laravel线上环境CSRF Token Mismatch 问题排查及解决方案
问题核心特征
本地、测试环境运行正常,仅线上HTTPS环境触发CSRF校验失败,属于典型的线上环境配置类问题,和业务代码无关,可按以下顺序排查:
排查方向及解决方案
会话配置校验
检查线上.env文件的以下配置项,确保和线上环境匹配:
配置修改后执行APP_URL=https://mybestlife.mg-wellness.com SESSION_DOMAIN=.mg-wellness.com # 无多子域名需求可直接填写完整域名mybestlife.mg-wellness.com SESSION_SECURE_COOKIE=true # HTTPS环境必须设为true,否则浏览器不会保存会话Cookie SESSION_DRIVER=filephp artisan config:cache清空配置缓存生效。存储权限校验
确保线上项目的storage/、bootstrap/cache/目录读写权限配置正确,对应web服务器运行用户(通常为www-data)有写入权限,可执行以下命令修复:
会话文件无法写入会导致每次请求生成新的Session,CSRF Token自然无法匹配。chmod -R 755 storage bootstrap/cache chown -R www-data:www-data storage bootstrap/cache # 按自身web服务运行用户调整参数前端CSRF头校验
- 确认登录页面的
<head>标签内存在CSRF Token的meta声明:
<meta name="csrf-token" content="{{ csrf_token() }}">- 确认Ajax代码中使用的
headers变量已经正确赋值X-CSRF-TOKEN,推荐全局配置避免遗漏:
若线上静态资源存在缓存,可强制刷新页面或者给静态资源加版本号清理旧缓存。$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });- 确认登录页面的
反向代理/CDN配置校验
如果线上使用了Nginx反向代理、CDN、负载均衡服务,需要做两处配置:- Nginx配置中添加请求头转发规则:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;- 打开
app/Http/Middleware/TrustProxies.php,配置信任代理:
未配置信任代理会导致Laravel识别请求为HTTP而非HTTPS,会话Cookie无法保存,触发CSRF校验失败。protected $proxies = '*'; // 也可填写实际代理/CDN的IP段 protected $headers = Request::HEADER_X_FORWARDED_ALL;路由校验
确认登录提交路由配置在web中间件组下,只有web中间件会启动会话、加载CSRF校验逻辑:Route::group(['middleware' => ['web']], function () { // 登录路由放在该分组内 });
内容的提问来源于stack exchange,提问作者user2485518
相关产品推荐
相关产品推荐

