必须配置 proxy_cookie_domain 指令,因浏览器按同源策略忽略不匹配 domain 的 cookie;需用 .example.com(带点)实现子域共享,并配合 cors 凭据头与前端 credentials: 'include'。

核心是让后端设的 Cookie Domain 值能被前端访问域名正确识别和发送,proxy_cookie_domain 是关键指令,不是可选项,而是必须项。
为什么浏览器会丢掉 Cookie
后端(比如 10.0.1.5:8000 或 api.example.com)返回的 Set-Cookie 头里写了 Domain=10.0.1.5 或 Domain=api.example.com,而用户实际访问的是 shop.example.com。浏览器按同源策略直接忽略该 Cookie——它既不匹配当前域名,也不属于其父域范围。
真正起作用的不是“后端有没有发 Cookie”,而是“浏览器愿不愿意存、敢不敢发”。
必须配 proxy_cookie_domain 的典型场景
- 前端地址是
admin.example.com,Nginx 代理到后端192.168.1.20:3000,后端返回Domain=192.168.1.20 - 前后端同属
example.com主域,但后端设了Domain=backend.example.com或没设 Domain(默认取 Host 值) - 后端无法修改代码,不能主动写
Domain=.example.com
基础配置:静态替换最常用
在对应 location 块中添加,且必须放在 proxy_pass 之后:
location /api/ {
proxy_pass http://10.0.1.5:8000;
proxy_set_header Host $host;
proxy_cookie_domain 10.0.1.5 .example.com;
proxy_cookie_domain backend.local .example.com;
}
注意:.example.com 开头的点号不能省略。带点表示“允许所有子域”,如 shop.example.com、admin.example.com 都能读写;若写成 example.com(无点),只精确匹配该域名,子域无法共享。
进阶处理:用正则应对模糊或动态 Domain
当后端可能返回 Domain=backend.example.com 或 Domain=.backend.example.com,而你想统一收口为 .example.com,静态替换会失效(因为少一个点就不匹配)。
启用正则语法:
proxy_cookie_domain ~\.?backend\.example\.com .example.com;
也可清除原 Domain 并强制设值:
proxy_cookie_domain "" .example.com;
这个写法适用于后端完全没设 Domain,或设了非法值(如 IP)的情况。
配套动作缺一不可
- 确保后端响应头含
Access-Control-Allow-Origin: https://shop.example.com(不能是*) - 后端必须返回
Access-Control-Allow-Credentials: true - 前端请求需带上凭据:
fetch(url, { credentials: 'include' }) - HTTPS 环境下,Cookie 要加
Secure;Chrome 80+ 还需SameSite=None











