proxy_cookie_domain用于替换后端Set-Cookie中的Domain值以匹配前端域名,需配合CORS凭据头、前端credentials: 'include'及Secure/SameSite=None等配置生效。

核心是让浏览器愿意存、敢发 Cookie,不是强行“跨域传输”。proxy_cookie_domain 的作用很明确:在 Nginx 把后端响应发给前端之前,把 Set-Cookie 头里的 Domain 字段替换成匹配当前访问域名的合法值。
先确认真需要它
不是所有反向代理都要配这个指令。只有当后端响应中实际写了 Domain=xxx,且这个 xxx 和用户正在访问的域名不兼容时,才必须介入:
- 后端返回 Set-Cookie: sid=abc; Domain=10.0.1.5,用户打开的是 admin.example.com → 浏览器直接丢弃
- 后端返回 Set-Cookie: sid=abc(没设 Domain),但响应头 Host 是 api.internal → 浏览器按 Host 推导 Domain,结果仍是 api.internal,仍不匹配
- 后端返回 Set-Cookie: sid=abc; Domain=.example.com → 已正确,无需配置
静态替换:最常用也最稳妥
适用于后端写死的 Domain 值固定、可预知的场景。指令必须放在 location 块内,且在 proxy_pass 之后:
- 把 Domain=192.168.1.20 改成通配子域格式:proxy_cookie_domain 192.168.1.20 .example.com;
- 把 Domain=backend.local 改为对外主域:proxy_cookie_domain backend.local .example.com;
- 注意 replacement 域名前的点号不能省:.example.com 表示 shop.example.com、api.example.com 都能读取;写成 example.com(无点)只精确匹配该字符串,基本无效
正则匹配:应对模糊或动态情况
当后端可能返回多种格式(如 Domain=api.example.com、Domain=.api.example.com、Domain=localhost),静态替换容易漏掉:
- 统一收口到主域:proxy_cookie_domain ~\.?api\.example\.com .example.com;
- 清空原有 Domain 并强制设为指定值(适合后端没设或设错):proxy_cookie_domain "" .example.com;
- 匹配带端口的 upstream:proxy_cookie_domain ~\b192\.168\.1\.20:8080\b .example.com;
配套动作一个都不能少
单独配 proxy_cookie_domain 不会生效。必须同步满足:
- 后端响应头含 Access-Control-Allow-Origin: https://admin.example.com(不能是 *)
- 后端响应头含 Access-Control-Allow-Credentials: true
- 前端请求开启凭据:fetch(url, { credentials: 'include' })
- Cookie 自身需带 Secure(HTTPS 环境下必需)和 SameSite=None(Chrome 80+ 要求)
- 若后端还设置了 Path(如 Path=/internal/),而前端访问路径不同,需额外加 proxy_cookie_path /internal/ /;










