proxy_cookie_domain用于重写后端set-cookie的domain属性以匹配前端域名,解决跨域cookie丢失问题;需配合cors凭据、secure/samesite=none及proxy_cookie_flags等配置才能生效。

Nginx 的 proxy_cookie_domain 本身不支持动态值(如变量),但可通过组合 map、proxy_cookie_domain 和请求上下文,实现按上游服务或客户端来源**动态重写 Cookie 的 Domain 属性**,解决微服务跨域场景下登录态无法透传的问题。
核心原理:用 map 预先映射目标 Domain
Cookie 的 Domain 必须匹配当前访问域名,否则浏览器会拒绝携带。当用户通过统一网关(如 app.example.com)访问不同微服务(user.svc、order.svc),而这些服务返回的 Cookie 原 Domain 是 .svc 或 localhost 时,需在 Nginx 反向代理层将其改写为 .example.com 或具体子域。
由于 proxy_cookie_domain 不接受变量,需借助 map 指令将上游服务名、Host 头或路径等信息,映射为合法的 Domain 值:
map $upstream_http_set_cookie $target_cookie_domain {
~Domain=\.svc(;|$) ".example.com";
~Domain=localhost(;|$) "app.example.com";
default ".example.com";
}
⚠️ 注意:$upstream_http_set_cookie 是上游响应头中的原始 Set-Cookie 字符串,map 仅支持正则匹配字符串开头/片段,不能解析完整 Cookie 属性。因此该方式适用于规则较固定的场景(如所有微服务统一设 Domain=.svc)。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
更可靠方案:用 proxy_cookie_path + rewrite 拦截并重写 Set-Cookie
当需要精确控制 Domain、Path、Secure、HttpOnly 等多个属性,或上游 Cookie 格式不统一时,推荐用 sub_filter 配合 proxy_cookie_path 进行字符串级替换(需开启 sub_filter_last_modified off 避免缓存干扰):
- 启用
sub_filter并设置作用范围:sub_filter_once off; - 匹配并替换 Domain:
sub_filter 'Domain=.svc' 'Domain=.example.com'; - 确保响应头未被压缩(关闭 gzip):
gzip off;(或对 Set-Cookie 响应类型禁用压缩) - 配合
proxy_cookie_path / /;统一 Path,避免路径不一致导致 Cookie 不发送
✅ 优点:可处理多 Cookie、复杂属性;❌ 缺点:依赖文本替换,若上游 Cookie 含空格、换行或编码字符需额外处理。
适配多租户或灰度场景:基于 Host 或 Header 动态计算 Domain
若网关需同时支撑多个租户(如 tenant-a.example.com、tenant-b.example.com),可结合 map 和内置变量构造目标 Domain:
map $host $cookie_domain {
~^(?<t>[a-z0-9-]+)\.example\.com$ ".$t.example.com";
default ".example.com";
}
server {
location /api/user/ {
proxy_pass https://user-svc;
proxy_cookie_domain $cookie_domain $cookie_domain;
}
}</t>
? 关键点:proxy_cookie_domain 支持两个参数(旧 Domain、新 Domain),第二个参数可使用变量(Nginx ≥ 1.19.0),且必须以 . 开头才被浏览器识别为通配域。因此 $cookie_domain 值需严格为 .tenant-a.example.com 形式。
必须同步处理的配套项
-
CORS 头:确保
Access-Control-Allow-Origin与当前请求 Origin 一致(可用变量$http_origin),并设置Access-Control-Allow-Credentials: true -
Secure 和 SameSite:HTTPS 环境下 Cookie 需加
Secure;现代浏览器要求SameSite=None; Secure才允许跨站携带,可在proxy_cookie_flags(Nginx ≥ 1.19.3)中统一追加:proxy_cookie_flags ~ samesite=none secure; - 后端配合:Spring Cloud Gateway、Envoy 等网关也支持类似功能,若 Nginx 层逻辑过重,建议将 Cookie 重写下沉到更靠近服务的网关层










