Laravel多子域名项目共享登录失效问题排查求助
Laravel跨子域名共享登录问题排查方案
针对你主域名haderegypt.com与子域名doctors.haderegypt.com等共享登录失效的问题,结合你已完成的配置(共享users表、统一APP_KEY/Cookie/Session名称),从以下核心维度排查:
一、Session与Cookie核心配置检查
1. Session Domain 配置
必须确保所有项目的Session Cookie域名设置为顶级域名前缀格式,让所有子域名可共享:
- 在
.env文件中设置:SESSION_DOMAIN=.haderegypt.com(注意前缀的点不能省略) - 对应
config/session.php中的配置:'domain' => env('SESSION_DOMAIN', null),确保未硬编码为具体子域名
2. Cookie Secure 属性
如果网站启用HTTPS,必须开启Secure Cookie,否则浏览器会拒绝跨子域名传递Cookie:
.env设置:SESSION_SECURE_COOKIE=trueconfig/session.php对应:'secure' => env('SESSION_SECURE_COOKIE', false)
3. SameSite 属性
SameSite设为strict会导致跨域名跳转时Cookie不被携带,直接触发登出,需调整为:
.env设置:SESSION_SAME_SITE=laxconfig/session.php对应:'same_site' => env('SESSION_SAME_SITE', 'lax')
若需更宽松的跨域支持(如跨子域名iframe登录),可设为none,但必须配合SESSION_SECURE_COOKIE=true
4. Cookie 路径
确保Cookie路径为根目录,覆盖所有子路径:
config/session.php中'path' => '/',默认已配置,但需确认未被修改
二、Session 存储与一致性检查
1. Session 驱动统一
所有项目必须使用共享型Session驱动:
- 若用数据库驱动:确保所有项目连接同一数据库,且
config/session.php中'driver' => 'database',Session表结构一致 - 若用Redis/Memcached:确保所有项目连接同一缓存实例,且
SESSION_PREFIX统一(避免键名冲突)
禁止使用file驱动,因为各项目的本地文件存储隔离,无法共享Session
2. Laravel 版本一致性
不同Laravel版本的Session加密、Cookie处理逻辑可能存在差异,需确保所有项目的Laravel主版本一致(如均为8.x/9.x),避免因加密算法不兼容导致Session验证失败
三、环境与缓存清理
1. 环境变量统一
所有项目的APP_ENV必须相同(如均为production或local),Laravel部分加密逻辑会随环境变量调整,不一致可能导致Session解密失败
2. 彻底清理缓存
执行以下命令确保配置生效:
php artisan config:clear php artisan cache:clear php artisan session:clear
注意:若使用config:cache,需先执行config:clear再重新缓存,避免旧配置残留
四、浏览器与服务器层面排查
1. 浏览器Cookie验证
打开浏览器开发者工具(Application标签),查看主域名的Cookie:
- 确认
domain属性为.haderegypt.com - 确认
secure属性与HTTPS状态匹配 - 确认
SameSite属性为Lax或None
测试时建议使用无痕模式,避免旧Cookie干扰
2. 服务器响应头检查
检查Nginx/Apache是否有修改Cookie响应头的配置:
- 禁止服务器强制设置
Domain或SameSite属性(会覆盖Laravel的配置) - 确保HTTPS配置正确,无证书或跳转异常导致Cookie传递失败
五、自定义逻辑排查
- 检查是否存在自定义Auth中间件或登录逻辑,是否对Session附加了IP限制、设备验证等额外校验
- 确认
config/auth.php中的用户Provider配置完全一致,确保各项目读取同一users表及用户模型
内容的提问来源于stack exchange,提问作者HOSSAM ALI
相关产品推荐
相关产品推荐

