Laravel多子域名会话冲突问题:同一应用跨子域无法正常运行
解决Laravel跨子域会话冲突问题
嘿,这个问题我之前处理过不少——多子域共享同一个Laravel应用时,会话Cookie的域限制是最常见的坑。咱们直接说解决方案,一步步来:
1. 修改会话Cookie的Domain配置
你现在的config/session.php里domain设置的是subd1.example.com,这就导致会话Cookie只能在这个子域下被识别,subd2自然读不到。要让两个子域都能共享会话,得把Domain改成根域的通配形式:
打开config/session.php,把domain项改成:
'domain' => env("SESSION_DOMAIN", ".example.com")
注意前面的.不能少,它表示这个Cookie对example.com下的所有子域都生效。
2. 更新环境变量(.env文件)
为了确保配置在生产环境生效,记得在你的.env文件里添加或修改这一行:
SESSION_DOMAIN=.example.com
这样不管是subd1还是subd2,都会使用这个统一的域配置。
3. 清理旧会话Cookie
因为用户之前访问subd1时,浏览器已经存储了绑定subd1.example.com的旧Cookie,这些旧Cookie会和新配置的Cookie冲突。你可以:
- 自己测试时手动清除浏览器对应域名的Cookie
- 给用户提示,让他们清理浏览器缓存(或者在应用里做一次Cookie过期处理)
4. 验证会话共享
部署修改后,你可以做个简单测试:
- 在subd1.example.com登录账号
- 直接访问subd2.example.com,看看是否保持登录状态
- 检查浏览器的Cookie管理面板,确认会话Cookie的Domain是
.example.com
另外补充两点:
- 你的
cookie名称subd1examplecom可以保留,不用修改,只要两个子域用同一个名称就行 - 如果你的会话驱动用的是
file,确保存储目录(storage/framework/sessions)的权限没问题,两个子域的请求都能读写这些文件
这样调整后,两个子域就能正常共享会话了,不会再出现冲突问题。
内容的提问来源于stack exchange,提问作者Manuel Postigo
相关产品推荐
相关产品推荐

