proxy_cookie_domain指令用于重写后端Set-Cookie响应头中的Domain属性,解决反向代理下Cookie跨域失效问题;支持精确替换、正则匹配及清空Domain三种用法,需配合proxy_pass在location块中配置。

在 Nginx 中使用 proxy_cookie_domain 指令,可以重写后端应用 Set-Cookie 响应头中的 Domain 属性,使 Cookie 能被正确发送到当前访问的域名(尤其是反向代理场景下跨域或子域不一致时)。
作用与适用场景
当后端服务(如 Python Flask、Java Spring Boot)设置 Cookie 时,可能硬编码了 Domain=backend.example.com,但用户实际访问的是 app.example.com。浏览器会拒绝发送该 Cookie,导致登录态丢失、Session 失效等问题。proxy_cookie_domain 就是用来动态替换这个 Domain 值的。
基本语法和用法
该指令必须放在 location 或 server 块中,且需配合 proxy_pass 使用。它只修改响应头中 Set-Cookie 的 Domain 字段,不影响其他 Cookie 属性(如 Path、Secure、HttpOnly)。
- 替换为指定域名:
proxy_cookie_domain backend.example.com app.example.com; - 匹配并替换所有子域:
proxy_cookie_domain ~\.example\.com$ .example.com;(正则开头的~表示启用正则,末尾$确保精确匹配) - 清空 Domain 字段(让浏览器按当前 Host 自动推导):
proxy_cookie_domain off;或proxy_cookie_domain "" "";
常见配置示例
假设用户访问 https://admin.myapp.com,后端服务部署在 127.0.0.1:8000 并设置了 Domain=api.myapp.com,需要改为适配当前域名:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_cookie_domain api.myapp.com admin.myapp.com;
proxy_cookie_path / /;
}
若后端返回多个 Cookie,且 Domain 各不相同(如 Domain=dev.api.myapp.com、Domain=staging.api.myapp.com),可用正则统一处理:
proxy_cookie_domain ~\.(api|backend)\.myapp\.com$ .myapp.com;- 注意:正则中点号需转义,括号需反斜杠转义(
\.、\(、\)),否则会报错
注意事项和排错要点
该指令不会生效于已带 Secure 标志但当前是 HTTP 请求的 Cookie(Nginx 不会自动删掉 Secure);也不修改 Cookie 的 Path,如需调整请搭配 proxy_cookie_path。
- 确保
proxy_cookie_domain在proxy_pass所在 location 内,不在 upstream 或 http 全局块中 - 如果后端返回的 Cookie 没有 Domain 字段,该指令不生效(Nginx 只改已有 Domain)
- 调试时可用
curl -v http://your-domain/查看响应头中的 Set-Cookie 是否已变更 - 多级子域(如从
user.api.example.com→.example.com)需确保目标 Domain 符合浏览器同源策略(不能跨主域)


















