
本文详解如何正确配置 php session,使其在主域名与子域名之间无缝共享,涵盖 cookie 域设置、会话初始化时机、常见陷阱及完整可运行示例。
本文详解如何正确配置 php session,使其在主域名与子域名之间无缝共享,涵盖 cookie 域设置、会话初始化时机、常见陷阱及完整可运行示例。
在构建跨子域名的用户系统(如 domain.com 登录后跳转至 subdomain.domain.com)时,Session 无法自动传递是高频问题。根本原因并非 Session 本身不支持跨域,而是 Session ID 的载体——Cookie 默认作用域受限。PHP 默认将 session cookie 绑定到当前完整主机名(如 domain.com),而不会自动向 subdomain.domain.com 发送,导致子域名无法识别同一会话。
✅ 正确配置步骤(关键三要素)
-
统一设置 session.cookie_domain
必须在启动会话前(即 session_start() 之前)通过 ini_set() 或 php.ini 设置 Cookie 作用域为根域名(带前导点号):// domain.com/login.php 和 subdomain.domain.com/index.php 中均需设置 ini_set('session.cookie_domain', '.domain.com'); session_start();⚠️ 注意:.domain.com 中的前导点号 . 表示“此域名及其所有子域名”,缺一不可;若写成 domain.com(无点号)则仅匹配精确主机名,不生效于子域名。
-
确保 session_start() 是脚本中首个会话相关操作
session_start() 必须在任何输出(包括空格、BOM、HTML)之前调用。建议在文件顶部立即设置并启动:<?php // subdomain.domain.com/index.php ini_set('session.cookie_domain', '.domain.com'); session_start(); if ($_SESSION['login'] ?? false) { echo "Welcome, " . htmlspecialchars($_SESSION['user']); } else { echo "You Don't Have Permission"; } ?> 验证协议与端口一致性(进阶注意)
若主站使用 HTTPS(如 https://domain.com),子域名也应使用 HTTPS 跳转,并确保 session.cookie_secure = 1(仅 HTTPS 传输)与 session.cookie_httponly = 1(防 XSS)等安全设置同步启用,否则 Cookie 可能被浏览器拒绝发送。
? 完整可验证流程示例
✅ domain.com/login.php
<?php // 强制设置跨子域 Cookie 域
ini_set('session.cookie_domain', '.domain.com');
ini_set('session.cookie_secure', 1); // 生产环境启用 HTTPS
ini_set('session.cookie_httponly', 1);
session_start();
$_SESSION['login'] = 'ok';
$_SESSION['user'] = 'wh1z';
// 确保跳转 URL 协议一致(HTTPS → HTTPS)
header('Location: https://subdomain.domain.com/index.php');
exit;
?>
✅ subdomain.domain.com/index.php
审查 Remix v2 代码中的 v1 形态 meta 导出(v2 中为破坏性变更),cookie 安全漏洞(httpOnly、secure、密钥轮换),认证门位于错误层级,以及其他
<?php ini_set('session.cookie_domain', '.domain.com');
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_httponly', 1);
session_start();
if ($_SESSION['login'] === 'ok' && isset($_SESSION['user'])) {
echo '<h2>Welcome, ' . htmlspecialchars($_SESSION['user']) . '';
} else {
http_response_code(403);
echo '<p>You Don\'t Have Permission</p>';
}
?>
❗ 常见错误排查清单
- [ ] 是否在 session_start() 之前 设置了 session.cookie_domain?
- [ ] Cookie 域是否写为 .domain.com(带点号)而非 domain.com?
- [ ] 主站与子域名是否使用相同协议(HTTP/HTTPS)?混合协议会导致 Cookie 被拦截。
- [ ] 浏览器开发者工具 → Application → Cookies 中,是否能看到 PHPSESSID Cookie 的 Domain 显示为 .domain.com?
- [ ] 是否存在多个 session_start() 或重复设置 session.cookie_domain?这可能导致配置覆盖。
? 提示:若服务器部署在不同物理主机(非同源),还需额外配置共享 Session 存储(如 Redis 或数据库),但本文场景默认主站与子域名共用同一 PHP 运行环境及默认文件存储,故无需额外处理。
通过以上标准化配置,Session 即可在 domain.com 与任意子域名(subdomain.domain.com, api.domain.com 等)间可靠共享,为构建统一身份认证体系奠定坚实基础。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










