Ubuntu虚拟主机部署Laravel出现csrf_token mismatch错误如何解决
问题原因
- Session/Cookie域名不匹配:Laravel的session绑定请求域名,本地用127.0.0.1运行时配置自动适配,部署后使用
test.local域名访问时,.env或config/session.php中的SESSION_DOMAIN参数如果没有配置为对应域名,会导致CSRF校验依赖的session cookie无法正常读取,出现mismatch错误。 - 存储目录权限不足:Ubuntu环境下Laravel的
storage、bootstrap/cache目录没有给web服务器用户赋予写入权限,session数据无法正常落盘,每次请求都会生成新的CSRF token,和表单提交的旧token校验失败。 - Apache重写模块未开启:虽然虚拟主机配置里已经设置了
AllowOverride All,但如果apache的mod_rewrite模块没有启用,Laravel自带的public/.htaccess规则无法生效,会导致请求头中的cookie传递异常,影响CSRF校验。 - 协议配置不一致:如果后续配置了HTTPS但未调整
SESSION_SECURE_COOKIE参数,或者存在反向代理导致Laravel识别的请求协议和实际协议不一致,也会出现cookie无法写入的问题。
解决步骤
- 调整域名相关配置
打开项目根目录的.env文件,修改或新增以下配置:
APP_URL=http://test.local SESSION_DOMAIN=test.local # 如果你使用了Laravel Sanctum,还需要新增下面这行 SANCTUM_STATEFUL_DOMAINS=test.local
修改完成后执行命令清除配置缓存:php artisan config:clear
- 修正目录权限
在项目根目录执行以下命令,给web运行用户(默认是www-data)赋予对应目录的读写权限:
sudo chown -R www-data:www-data storage bootstrap/cache sudo chmod -R 775 storage bootstrap/cache
- 开启Apache重写模块
执行命令开启mod_rewrite后重启Apache服务:
sudo a2enmod rewrite sudo systemctl restart apache2
- 清除项目所有缓存
依次执行以下命令清理旧的缓存、session数据:
php artisan cache:clear php artisan route:clear php artisan view:clear php artisan session:clear
内容的提问来源于stack exchange,提问作者user13627322
相关产品推荐
相关产品推荐

