yii2子域名拿不到session是因为cookie domain未正确配置为“.example.com”或前端请求未携带credentials,需确保php配置、yii配置、https协议及cors设置全部匹配。

Yii2 中 session.cookie_domain 设置为 .example.com 为什么子域名还是拿不到 session
因为 Yii 默认用 PHP 原生 session,而 session.cookie_domain 的值必须以点开头(如 .example.com),且当前请求的 Host 必须是该域的子域名(如 api.example.com 或 www.example.com),但不能是 example.com 本身 —— 否则浏览器会拒绝发送 cookie。
- 检查 Nginx/Apache 是否在响应头中覆盖了
Set-Cookie,比如加了Domain=example.com(缺前导点) - 确认 PHP 配置里没在运行时调用
ini_set('session.cookie_domain', 'example.com')(漏掉点) - Yii 应用启动前就要设置好,推荐在
web/index.php顶部或config/web.php的'components' => ['session' => [...]]中配'cookieParams' => ['domain' => '.example.com'] - 如果主站跑在
https://example.com,子域名也必须走 HTTPS,否则 Secure cookie 不会被携带
Yii2 session 跨域后登录态失效,但 $_SESSION 里数据还在
这是典型的 session ID 没同步过来:浏览器发请求时没带有效的 PHPSESSID cookie,Yii 新建了一个 session,但旧数据还留在服务端没清理 —— 看起来“有数据”,实际是不同 session。
- 用浏览器开发者工具的 Application → Cookies 面板,确认当前域名下是否存在
PHPSESSID,Domain 列是否显示为.example.com - 检查是否启用了
session.use_cookies = 1(PHP 默认开启),禁用后 Yii 只能靠 URL 参数传 ID,跨域不现实 - 避免在多个子域名下同时调用
Yii::$app->session->open()或手动 start_session(),容易触发 session_id 冲突 - 如果用了 Redis 存 session,确保所有子域名应用配置的是同一个 Redis 实例和 db,且
session.save_path一致
主域名 example.com 登录后,子域名 api.example.com 访问接口返回 401
不是鉴权逻辑问题,大概率是 session cookie 没随 AJAX 请求发出 —— 尤其当接口用 fetch 或 axios 调用时,默认不带 credentials。
- 前端发请求必须显式带上
credentials: 'include'(fetch)或withCredentials: true(axios) - 后端响应头要加
Access-Control-Allow-Origin: https://example.com(不能是*),否则浏览器拦截 credential 请求 - Yii 的
Response组件默认不设 CORS 头,需在config/web.php的'response' => ['on beforeSend' => function ($event) { ... }]里手动加 - 确认子域名接口路由没被 Yii 的
UrlManager或中间件误判为“非 Web 请求”,导致跳过 session 初始化
Yii1 和 Yii2 在跨域 session 处理上有什么关键差异
Yii1 默认用 CHttpSession,底层仍调 PHP session,但它的 cookieParams 默认不继承 session.cookie_domain,必须显式写死;Yii2 的 Session 组件更透明,但对 cookieParams 的校验更严格 —— 比如自动过滤非法 domain 值(空、localhost、IP 地址)。
- Yii1 配置示例:
'session' => ['class' => 'CHttpSession', 'cookieParams' => ['domain' => '.example.com']] - Yii2 配置示例:
'session' => ['class' => 'yii\web\Session', 'cookieParams' => ['domain' => '.example.com', 'httpOnly' => true, 'secure' => true]] - Yii1 不校验 domain 是否合法,填错也不会报错;Yii2 在
Session::getCookieParams()里会静默修正或忽略非法值,建议用var_dump(Yii::$app->session->getCookieParams())确认最终结果 - 两者都依赖 PHP 的
session_set_cookie_params(),所以最终行为仍受 php.ini 中session.cookie_httponly、session.cookie_secure影响











