本文详解通过正确配置 session_set_cookie_params() 和 session.cookie_domain,使登录子域名(如 login.testsite.co.kr)产生的 session 可被其他同根子域名(如 100.testsite.co.kr)共享,解决因 cookie 域名范围不匹配导致的登录态丢失问题。
在多子域名架构中(例如 testsite.co.kr、login.testsite.co.kr、100.testsite.co.kr),实现统一登录态的核心在于:让 PHP 生成的会话 Cookie 被所有目标子域名识别并发送。常见失败场景(如仅在 login.testsite.co.kr 登录后无法在 100.testsite.co.kr 读取 $_SESSION['userid'])几乎均源于
Cookie 的作用域(Domain)设置不正确。
以下是修复后的标准写法(兼容 PHP 4.3+,但强烈建议升级至 PHP 8.x):
// session_test.php —— 所有子域名下均使用此配置
ini_set('session.cookie_domain', '.testsite.co.kr'); // 注意开头的点号!
session_set_cookie_params(0, '/', '.testsite.co.kr'); // ⚠️ 必须在 session_start() 前!
session_name('mysession');
session_cache_limiter('no-cache, must-revalidate');
session_start();
$_SESSION['userid'] = 'kim';? 为什么必须加前导点号(.testsite.co.kr)? 浏览器 Cookie 规范要求:带前导点号的 Domain 值表示“匹配该域名及其所有子域名”。若写成 testsite.co.kr(无点号),现代浏览器(Chrome/Firefox/Safari)将拒绝将其发送至任何子域名,仅限精确匹配主域名。这是导致 login.testsite.co.kr 登录后其他子域无法读取 Session 的根本原因。
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.testsite.co.kr',
'secure' => true, // 仅 HTTPS 传输
'httponly' => true, // 禁止 JS 访问
'samesite' => 'Lax' // 防 CSRF
]);部署上述代码后,按以下步骤验证:
? 提示:可借助浏览器开发者工具 → Application → Cookies,检查 PHPSESSID Cookie 的 Domain 字段是否为 .testsite.co.kr —— 这是最直观的验证依据。
通过精准控制 Cookie 的作用域与生命周期,跨子域名 Session 共享并非难题。核心原则始终是:让服务端生成的会话标识,以浏览器认可的方式,可靠地抵达每一个需要它的子域名。