本文详解php中跨子域名共享session的正确配置方法,重点解决因`session_set_cookie_params()`参数缺失导致的登录态无法同步问题,并提供兼容性注意事项与完整代码示例。
在多子域名架构(如 testsite.co.kr、login.testsite.co.kr、100.testsite.co.kr)中实现统一登录态,核心在于让 PHP 生成的 Session Cookie 被所有相关子域名共同识别和携带。常见误区是仅设置 ini_set("session.cookie_domain", ".testsite.co.kr"),却忽略了 session_set_cookie_params() 的域参数必须显式声明——该函数的第三个参数($domain)不可省略,且必须带前导点号(.testsite.co.kr),否则浏览器将按当前完整主机名(如 login.testsite.co.kr)严格匹配 Cookie,拒绝向 100.testsite.co.kr 发送。
正确配置需满足三个关键条件:
✅ 调用时机前置:session_set_cookie_params() 必须在 session_start() 之前执行;
✅ 参数完整明确:显式传入 $lifetime、$path 和 $domain 三参数,其中 $domain = '.testsite.co.kr'(注意开头的 .);
✅ 会话名称统一:所有子域名使用相同 session_name()(如 "mysession"),避免因名称不同导致会话隔离。
以下是修正后的 session_test.php 完整示例(适用于 PHP 5.6+,推荐升级以保障安全):
⚠️ 重要注意事项:
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.testsite.co.kr',
'secure' => true, // 仅 HTTPS 传输
'httponly' => true, // 防 XSS 窃取
'samesite' => 'Lax' // PHP 7.3+ 支持
]);
→ Application → Cookies,检查各子域名下是否均存在名为 mysession 的 Cookie,Domain 字段是否为 .testsite.co.kr。总结:子域名 Session 共享失败,90% 源于 session_set_cookie_params() 的 $domain 参数缺失或格式错误。牢记“三点原则”:点号开头(.testsite.co.kr)、调用在前、全站统一名。配合版本升级与安全标志,即可稳定实现跨子域单点登录。