PHP子域名间Session共享失效的解决方案

11次阅读

PHP子域名间Session共享失效的解决方案

本文详解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+,推荐升级以保障安全):

⚠️ 重要注意事项

  • PHP 版本兼容性:原始问题中使用 PHP 4.3(已废弃超13年),现代浏览器chrome/firefox/safari)因安全策略(如 SameSite、Secure 标志要求)可能直接拒绝其生成的 Cookie。务必升级至 PHP 7.4+ 或 8.x;
  • https 环境强化:若站点启用 HTTPS,应在 session_set_cookie_params() 中增加 Secure 和 HttpOnly 标志:
    session_set_cookie_params([     'lifetime' => 0,     'path'     => '/',     'domain'   => '.testsite.co.kr',     'secure'   => true,      // 仅 HTTPS 传输     'httponly' => true,      // 防 XSS 窃取     'samesite' => 'Lax'      // PHP 7.3+ 支持 ]);
  • 服务器级验证:确保所有子域名解析到同一台服务器(或共享 Session 存储后端,如 redis),且 session.save_path 配置一致;
  • 浏览器调试技巧:使用开发者工具application → Cookies,检查各子域名下是否均存在名为 mysession 的 Cookie,Domain 字段是否为 .testsite.co.kr。

总结:子域名 Session 共享失败,90% 源于 session_set_cookie_params() 的 $domain 参数缺失或格式错误。牢记“三点原则”:点号开头(.testsite.co.kr)、调用在前、全站统一名。配合版本升级与安全标志,即可稳定实现跨子域单点登录。

立即学习PHP免费学习笔记(深入)”;

text=ZqhQzanResources