必须设为'.example.com':开头带点表示匹配所有子域;错误写法如'example.com'(无点)、'*.example.com'(通配符无效)、'localhost'(本地不支持)均导致跨子域失效。

session.cookie_domain 是 PHP 原生会话机制的配置项,PHP 官方并未发布 8.6 版本——截至 2026 年 8 月,PHP 最新稳定版是 PHP 8.3(2023年11月发布),后续版本为 PHP 8.4(2024年11月)、PHP 8.5(2025年12月)。目前不存在 PHP 8.6,可能是误记或混淆。
但无论 PHP 版本是 8.3、8.4 还是 8.5,session.cookie_domain 的设置规则完全一致,关键只看你的部署场景:
要跨子域共享 Session,必须设为 .example.com
- ✅ 正确写法:
'.example.com'(开头带英文点,无协议,无端口,不带www或其他子域前缀) - ❌ 错误写法:
'example.com'(缺前导点,浏览器视为精确匹配,不共享给子域)、'*.example.com'(通配符无效)、'localhost'(本地开发时不可用,浏览器拒绝)、'http://example.com'(含协议非法)
实际怎么设?三种常用方式
-
方式一:php.ini 中全局设置(推荐生产环境)
PHP 8.5.12 RC 1下载PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
session.cookie_domain = ".example.com" session.cookie_secure = 1 ; HTTPS 环境下必须开启 session.cookie_httponly = 1 session.cookie_samesite = "Lax" ; 避免 Strict 导致跨子域请求丢失 Cookie
-
方式二:运行时动态设置(代码中)
必须在session_start()之前调用:ini_set('session.cookie_domain', '.example.com'); ini_set('session.cookie_secure', '1'); ini_set('session.cookie_httponly', '1'); ini_set('session.cookie_samesite', 'Lax'); session_start(); -
方式三:用 session_set_cookie_params()(更现代、推荐)
同样需在session_start()前执行:session_set_cookie_params([ 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'Lax', 'path' => '/', ]); session_start();
特别注意几个坑
- 本地开发时,不要用
localhost做 domain —— 浏览器不支持.localhost。可改用test.local并配 hosts(如127.0.0.1 api.test.local user.test.local),再设'.test.local' - HTTPS 环境下,
session.cookie_secure必须为true,否则 Cookie 不会被发送 -
SameSite=Lax是跨子域最稳妥的选择;Strict会导致子域间跳转时 Cookie 不携带;None则必须搭配secure=true - ThinkPHP、Laravel 等框架只是封装了 session,底层仍依赖 PHP 原生配置,只改框架配置(如
cookie_domain)而不改session.cookie_domain,Session 依然无法跨子域
不复杂但容易忽略
立即学习“PHP免费学习笔记(深入)”;


















