核心是通过Nginx的proxy_cookie_domain精准重写Set-Cookie中的Domain,配合Access-Control-Allow-Origin、Access-Control-Allow-Credentials、credentials: 'include'及Secure/SameSite属性,确保Cookie仅发往当前访问域名。

核心是让浏览器只把 Cookie 发给当前访问的域名,而不是被后端写死的非法 domain 搞乱。Nginx 的 proxy_cookie_domain 是关键,但它必须配合其他几项才能真正生效。
先判断要不要配
不是所有负载均衡都要动这个配置。只有满足以下任一情况才需要:
- 后端返回的 Set-Cookie 头里明确写了 Domain=,比如 Domain=192.168.1.5 或 Domain=backend.local
- 多个前端域名(如 shop.example.com、admin.example.com)共用同一套后端,但后端无法根据 Host 动态生成正确的 Domain
- 后端没设 Domain,但响应头里的 Host 是内网地址(如 Host: 10.0.0.10:8080),浏览器会自动推导出错误 domain 并丢弃 Cookie
静态替换:适合单一主域场景
如果所有前端都属于同一个主域(比如都跑在 .example.com 下),直接字符串替换最稳:
- 后端写 Domain=192.168.1.100 → 前端访问的是 www.example.com,就加这行:proxy_cookie_domain 192.168.1.100 .example.com;
- 后端写 Domain=api.internal → 统一收口到 .company.com,写:proxy_cookie_domain api.internal .company.com;
注意:目标域名前面一定要加点(.example.com),表示允许所有子域;不加点(example.com)只匹配精确域名,多数情况会失效。
动态提取:应对多主域混合接入
当一台 Nginx 同时要处理 a.netkiller.cn、b.test.org、portal.other.site 等不同主域请求时,就得从 $host 动态提取根域:
- 在 location 块里加三行:
- set $root_domain $host;
- if ($host ~* ^(?:www\.)?([^.]+)\.([^.]+\.[^.]+)$) { set $root_domain $2; }
- proxy_cookie_domain ~\.?[^.]+\.[^.]+\.[^.]+ $root_domain;
这样,无论用户访问哪个域名,Set-Cookie 中的 Domain 都会被重写成对应主域(如 netkiller.cn 或 test.org),各站点登录态互不干扰。
配套动作缺一不可
单独配 proxy_cookie_domain 不起作用。必须同步做到:
- 后端响应头带 Access-Control-Allow-Origin: https://当前访问域名(不能是 *)
- 后端响应头带 Access-Control-Allow-Credentials: true
- 前端请求开启凭据:fetch(url, { credentials: 'include' })
- 若走 HTTPS,Cookie 必须带 Secure 属性;跨站场景下必须显式声明 SameSite=None
不复杂但容易忽略


















