Cookie Domain参数必须显式传入c.SetCookie(),Echo不会自动补全;需设为".example.com"以跨子域共享,本地用localhost时Domain会被忽略,且Domain与Secure、Path须协同配置。

Cookie Domain参数必须显式传入c.SetCookie(),不能靠中间件自动补全
Echo 不会自动推导或补全 Cookie 的 Domain 属性。即使你配置了反向代理或设置了 X-Forwarded-Host,框架也不会把请求头里的域名自动塞进 http.Cookie.Domain 字段——这完全由你控制。
常见错误是只调用 c.SetCookie(&http.Cookie{Name: "sid", Value: "abc"}),漏掉 Domain,结果浏览器只在当前子路径(如 localhost:8080 或 app.example.com)下发送该 Cookie,无法跨子域共享。
正确做法是手动指定完整域名字符串,注意以下几点:
- 若想让
user.example.com和api.example.com共享 Cookie,Domain必须设为".example.com"(开头带点) - 若设为
"example.com"(无点),现代浏览器(Chrome 120+、Firefox 115+)会拒绝接受,报Cookie “xxx” has been rejected because it is in a cross-site context - 本地开发时用
"localhost"无法设Domain,浏览器强制忽略;此时只能用Path隔离,或改用127.0.0.1配 hosts -
Domain值区分大小写,但实际生效以小写为准;建议统一用小写避免歧义
http.Cookie 的 Domain 和 Path 必须协同设置
仅设 Domain 不够,Path 决定了 Cookie 在该域名下的可访问路径范围。比如你希望登录态在全站生效,但又不想泄露给 /admin 以外的路径,就得配对控制。
典型组合示例:
cookie := &http.Cookie{
Name: "auth_token",
Value: "xyz789",
Path: "/",
Domain: ".example.com",
MaxAge: 3600,
HttpOnly: true,
Secure: true,
SameSite: http.SameSiteLaxMode,
}
c.SetCookie(cookie)
关键细节:
-
Path: "/"表示该 Cookie 对整个域名下所有路径都有效;设为"/api"则只在/api/xxx请求中携带 - 如果
Domain是".example.com",Path必须以/开头,否则浏览器可能静默丢弃 - 多个子域共用同一 Cookie 时,
Path应保持一致,否则会出现部分子域读不到的情况
HTTPS 环境下 Secure 和 Domain 联动失效的坑
当部署在 HTTPS 站点且启用了 Secure: true,但 Domain 设错,浏览器可能完全不发送该 Cookie,且不报错——你只会发现后端收不到,c.Cookie("auth_token") 返回 http.ErrNoCookie。
容易被忽略的三个联动条件:
- 服务器必须真实使用 HTTPS(不是 Nginx 反代 HTTPS + 后端 HTTP),否则
SecureCookie 永远不会被浏览器带上 -
Domain值必须与当前页面 URL 的域名“匹配”,例如页面是https://shop.example.com,则Domain: ".example.com"合法,Domain: "shop.example.com"也合法,但Domain: "other.com"会被浏览器直接屏蔽 - 若用 Let’s Encrypt 证书,且域名含通配符(如
*.example.com),Domain仍需写成".example.com",不能写"*.example.com"
测试时如何验证 Domain 是否生效
别只看响应头里有没有 Set-Cookie,要确认浏览器是否真把它存下来并回传:
- 打开 Chrome DevTools → Application → Cookies,检查对应域名下是否有该 Cookie 条目,且
Domain列显示的是你设的值(如.example.com) - 切换到另一个子域页面(如从
https://user.example.com跳转到https://api.example.com),再打开 Network → 任意请求 → Headers → Request Headers → Cookie,确认该 Cookie 是否出现 - 用
curl -v https://api.example.com/health --cookie "auth_token=xyz789"手动模拟,绕过浏览器逻辑快速验证服务端能否识别
最常被跳过的一步:忘记在 c.SetCookie() 之前检查 c.Request().Host 或上下文是否已知真实域名——尤其在 Docker 或 K8s 环境中,服务看到的 Host 往往是内部服务名(如 echo-svc),而非用户访问的 app.example.com。这时候得靠反向代理透传 X-Forwarded-Host 并手动提取,而不是硬编码 Domain。











