同一服务器部署两个Laravel项目出现CSRF token mismatch问题求助
解决方案:Laravel子域名登录CSRF Token Mismatch问题
针对你遇到的子域名dev.my-domain.com登录时的CSRF token mismatch错误,结合主域名正常、修改session路径无效的情况,可按以下步骤排查解决:
1. 配置Session Cookie的共享域名
Laravel的Session和CSRF Token依赖Cookie识别会话,主域名与子域名需配置统一的Cookie域名才能正确处理会话上下文:
- 打开子项目的
config/session.php,修改domain配置项为带前缀点的根域名:
(前缀点表示允许所有子域名适配该Cookie的会话规则)'domain' => '.my-domain.com', - 执行配置缓存清除命令,确保修改生效:
php artisan config:clear php artisan route:clear
2. 确保两个项目的Session存储完全独立
如果两个项目使用相同的Session驱动,需避免会话数据冲突:
- 若用
file驱动:确认子项目的storage/framework/sessions目录是独立的,且拥有服务器写入权限,不要与主项目共用该目录。 - 若用
database驱动:在子项目的config/session.php中修改table配置为不同的表名(如sessions_dev),或使用独立的数据库连接。
3. 检查VerifyCsrfToken中间件配置
确保子域名的请求被CSRF验证允许:
- 打开子项目的
app/Http/Middleware/VerifyCsrfToken.php,若存在跨域请求场景,可在$allowedOrigins中添加子域名(Laravel 9+支持):protected $allowedOrigins = [ 'https://dev.my-domain.com', ];
4. 彻底清除浏览器Cookie与服务器缓存
- 手动在浏览器中删除所有与
.my-domain.com相关的Cookie(包括主域名和子域名的),避免旧Cookie干扰会话识别。 - 重启服务器的Web服务(如Nginx/Apache),确保服务器层面的缓存被清除。
5. 排查服务器层面的Cookie配置
检查Nginx/Apache的站点配置,确认没有强制设置Cookie的Domain或Path属性,避免覆盖Laravel的配置。例如Nginx中若存在类似以下配置,需移除或调整:
add_header Set-Cookie "path=/; domain=my-domain.com; HttpOnly; Secure";
内容的提问来源于stack exchange,提问作者Web Star
相关产品推荐
相关产品推荐

