使用 proxy_cookie_domain 可重写后端 set-cookie 的 domain 属性,解决跨域登录态丢失问题;需配合 cors 凭据支持、前端 credentials 配置及 secure/samesite=none 等条件。

直接用 proxy_cookie_domain 重写后端响应中 Set-Cookie 的 Domain 属性,就能让浏览器在前端访问域名下合法存储并回传 Cookie,从而解决因域名不匹配导致的登录态丢失问题。它只改 Domain 字段,不碰 Path、Secure、请求头里的 Cookie 等其他内容。
先确认是否真需要它
不是所有代理场景都要配这个指令。只有以下情况才必须启用:
- 后端明确设置了
Domain=xxx(比如Domain=api.internal或Domain=10.0.1.5),但该值和用户实际访问的前端域名(如shop.example.com)不兼容 - 后端没设
Domain,但响应头Host是内网地址(如Host: 192.168.1.100:8080),浏览器会按此推导出非法Domain,导致 Cookie 被丢弃 - 多个二级域名共用同一套后端,而后端无法根据请求
Host动态生成正确Domain
基础静态替换写法
适用于后端返回的 Domain 固定、可预知的场景。指令必须放在 location 块内,且写在 proxy_pass 之后。
- 把
Domain=backend.local改成Domain=.example.com:proxy_cookie_domain backend.local .example.com; - 把
Domain=192.168.1.20改为通配子域格式:proxy_cookie_domain 192.168.1.20 .example.com; - 注意点号不能省:
.example.com表示允许www.example.com、api.example.com等所有子域读取;example.com(无点)只精确匹配该主域名,多数业务应带点
正则匹配应对动态或模糊域名
当后端可能返回多种格式(如 Domain=api.example.com、Domain=.api.example.com、Domain=localhost、甚至带端口的 Domain=192.168.1.20:8080),静态替换容易漏掉。用正则可一次覆盖:
- 统一收口到主域:
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 单独启用无法让 Cookie 正常跨域工作,还需满足以下全部条件:
- 后端响应头含
Access-Control-Allow-Origin: https://example.com(不能是*) - 后端响应头含
Access-Control-Allow-Credentials: true - 前端请求开启凭据:
fetch(url, { credentials: 'include' })或xhr.withCredentials = true - Cookie 自身需带
Secure(HTTPS 环境下必需)和SameSite=None(Chrome 80+ 强制要求)
不复杂但容易忽略











