thinkphp跨子域共享cookie需同时配置cookie_domain和session.cookie_domain:在config/app.php(tp6)或config.php(tp5.1)设'cookie_domain' => '.example.com',并在session启动前用ini_set('session.cookie_domain', '.example.com');值必须以点开头,本地开发禁用localhost,https下需同步启用cookie_secure,并确保samesite不为strict。

ThinkPHP 的 cookie_domain 配置在哪改
默认情况下,ThinkPHP 生成的 Cookie 只作用于当前完整域名(如 www.example.com),不自动跨子域。要让 user.example.com 和 api.example.com 共享同一份 Cookie(比如登录态),必须显式设置 Cookie 作用域为 .example.com(注意开头的点)。
修改位置在应用配置文件中:config/app.php(TP6)或 config.php(TP5.1/5.0)。关键配置项是 cookie_domain,它不是写在 session 配置里,而是独立的 Cookie 配置项。
- TP6:在
config/app.php中添加或修改'cookie_domain' => '.example.com' - TP5.1:在
config.php或extra/session.php中设'cookie_domain' => '.example.com',但注意 TP5.1 的 Session 默认用 PHP 原生机制,该配置需配合session_set_cookie_params()才生效 - 值必须以点开头(
.example.com),否则浏览器不认为是父域;也不能写成example.com(无点)或*.example.com(通配符无效)
Session 跨子域必须同时改 PHP 原生 session.cookie_domain
ThinkPHP 的 Session 底层多数情况下仍依赖 PHP 的原生 session_start(),而它的 Cookie 域由 PHP 配置 session.cookie_domain 控制。仅改 ThinkPHP 的 cookie_domain 不足以让 Session 跨子域——它只影响 ThinkPHP 自己 setcookie 的部分(如手动 Cookie::set()),不影响 session_start() 写入的 session_id Cookie。
- TP6 推荐方式:在
app/middleware.php或全局中间件中,调用ini_set('session.cookie_domain', '.example.com'),且必须在session_start()之前执行 - TP5.1:在
public/index.php开头(require '../thinkphp/start.php'之前)加ini_set('session.cookie_domain', '.example.com') - 如果使用 Redis 或数据库等非 file 驱动的 Session,仍需此设置——因为 session_id 的传输靠 Cookie,驱动只管存储
为什么设置了还是不共享?常见踩坑点
跨子域失效往往不是配置没写,而是被细节卡住。最常遇到的几个问题:
-
cookie_domain值写成了www.example.com或example.com(缺前置点),浏览器拒绝将 Cookie 发送给子域 - 开发环境用了 localhost 或 127.0.0.1 —— 浏览器明确禁止对
localhost设置带点的 domain(如.localhost),本地测试必须绑 hosts 使用真实二级域名(如test.example.com) - HTTPS 环境下未同步开启
cookie_secure:若主站强制 HTTPS,但子域 Cookie 没设'cookie_secure' => true,浏览器可能拒绝发送该 Cookie - TP6 中启用了
cookie_httponly或cookie_samesite限制过严,特别是SameSite=Strict会阻止跨站(含子域)请求携带 Cookie,建议设为Lax或显式关闭(null)
验证是否生效的快速方法
别等登录完再测,直接看响应头和浏览器开发者工具:
- 访问
user.example.com登录后,在 Network → Headers → Response Headers 中找Set-Cookie字段,确认其中包含Domain=.example.com - 切到
api.example.com页面,打开 Application → Cookies,检查是否有同名的 session_id Cookie 且 Domain 显示为.example.com - 用
var_dump($_COOKIE)和var_dump(session_id())在两个子域下分别输出,ID 一致才说明真正共享成功 - 注意:修改配置后务必清除浏览器所有相关域名下的 Cookie,否则旧 Cookie 会干扰判断
跨子域本质是浏览器行为,ThinkPHP 只是配置传递者。只要 Domain、Path、Secure、SameSite 四个属性对齐,且服务端 session 存储可被共用(如 Redis),就不存在框架级障碍——容易被忽略的是本地开发时用 localhost 测试,这根本走不通。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











