子域名间getcookie读不到session_id的主因是cookiedomain未设为".example.com",导致浏览器不发送cookie;需显式配置cookiedomain、cookiepath、cookiesecure、cookiehttponly及redis的database和prefix。

为什么子域名间 GetCookie 读不到 session_id
最常见的情况是 ctx.GetCookie("session_id") 返回空字符串,但浏览器 DevTools 明明显示该 Cookie 存在。根本原因不是 Iris 读不了,而是浏览器压根没把 Cookie 发过来 —— 因为服务端写入时没设对 Domain。Iris 默认的 SetCookieKV 或 session 管理器不会自动加点前缀,Domain: "example.com" 和 Domain: ".example.com" 效果完全不同:前者只匹配精确域名,后者才允许 a.example.com、api.example.com 共享。
Session 管理器必须显式配置 CookieDomain
Iris 的 sessions.Sessions 不会从请求 Host 自动推导跨域逻辑,必须手动指定 CookieDomain 才能生效:
-
CookieDomain: ".example.com"(注意开头的点)—— 所有子域名可读写 -
CookiePath: "/"—— 避免因路径不匹配漏掉请求,比如/user/profile和/api/v1都能带上 -
CookieSecure: true—— 生产环境必须开启,否则 HTTPS 下浏览器拒绝发送 -
CookieHTTPOnly: true—— 防 XSS,不影响后端读取
错误示范:sessions.Config{Cookie: "mysessionid"} 缺少 CookieDomain,本地 localhost 可能侥幸跑通,一上 admin.example.com 就失效。
Redis 分布式存储不能省略 Database 和 Prefix
子域名共享 session 的前提是所有实例读写同一份数据。如果用了 Redis,光连上地址远远不够:
-
Database: 1必须显式指定,很多云 Redis(如 AWS ElastiCache)默认禁用SELECT命令,不设这个字段会固定连到 db 0 -
Prefix: "myapp:sess:"必须设置,否则多个服务共用一个 Redis 时,DestroyAll()会误删别人的数据 -
Timeout: 3 * time.Second要写全单位,别漏time.Second,否则超时逻辑错乱
现象:本地单实例一切正常,上线 Kubernetes 多副本后用户频繁登出 —— 十有八九是 Redis key 冲突或连接参数没对齐。
前端跳转时 Cookie 不携带?检查 Referer 和 SameSite
用户从 app.example.com 点链接跳去 api.example.com,结果新页面里 GetCookie 还是空。这不是后端问题,而是浏览器策略拦截:
-
CookieSameSite默认是http.SameSiteLaxMode,跨站 POST/GET 请求(比如表单提交、链接跳转)下,Lax模式会阻止 Cookie 发送 - 解决办法:设成
http.SameSiteNoneMode,但必须搭配CookieSecure: true,否则现代浏览器直接拒收 - 验证方式:打开 DevTools → Application → Cookies,看目标域名下是否有该 Cookie;再切到 Network → 刷一次页面,点请求头里的
Cookie字段,确认它是否出现在Request Headers中
容易被忽略的是:SameSite 设置只影响浏览器发不发 Cookie,不影响服务端 SetCookie 的行为。所以即使你看到响应头里有 Set-Cookie,也不能说明前端能读到 —— 关键是下一次请求头里有没有它。











