Laravel如何实现仅指定子域名间的Session复用不影响其他子域
问题原因
你当前的配置会触发跨集群Session冲突:Cookie的识别规则由作用域域名、Cookie名称、路径三个参数共同决定,当你把SESSION_DOMAIN设为.example.com时,所有*.example.com的子域名都会携带默认名为laravel_session的Cookie。第二台服务器拿到第一台生成的Session ID后,会去自己的数据库查询,找不到对应记录就会导致登录失败。
解决方案
场景1:两台服务器部署独立代码、可单独配置.env
直接给两个集群设置不同的Session Cookie名称即可,同集群内的子域名仍可正常共享Session:
- 第一台服务器(对应
example.com、first.example.com)的.env配置:
SESSION_DOMAIN=.example.com SESSION_COOKIE=first_cluster_session
- 第二台服务器(对应
second.example.com、third.example.com)的.env配置:
SESSION_DOMAIN=.example.com SESSION_COOKIE=second_cluster_session
配置修改后执行php artisan config:clear清除配置缓存即可生效。
场景2:两台服务器共用同一份代码、无法单独配置.env
直接修改config/session.php,根据当前访问域名动态分配Session配置:
<?php $currentHost = request()->getHost(); // 分组配置对应的域名 $firstGroup = ['example.com', 'first.example.com']; $secondGroup = ['second.example.com', 'third.example.com']; if (in_array($currentHost, $firstGroup)) { $customDomain = '.example.com'; $customCookie = 'first_group_session'; } elseif (in_array($currentHost, $secondGroup)) { $customDomain = '.example.com'; $customCookie = 'second_group_session'; } else { // 兜底默认配置 $customDomain = env('SESSION_DOMAIN', null); $customCookie = env('SESSION_COOKIE', 'laravel_session'); } return [ // 其他原有配置项保持不变 'domain' => $customDomain, 'cookie' => $customCookie, // 其他原有配置项保持不变 ];
修改后清除配置缓存即可生效,不同分组的域名会自动使用独立的Session Cookie,不会互相干扰。
内容的提问来源于stack exchange,提问作者Hùng Nguyễn
相关产品推荐
相关产品推荐

