nginx默认忽略set-cookie、www-authenticate、expires、cache-control、connection、keep-alive、proxy-authenticate等响应头,proxy_pass_header仅用于取消对其中部分头的默认屏蔽,且优先级低于proxy_hide_header。

直接说结论:proxy_pass_header 不是“强制透传”,而是取消 Nginx 对某些响应头的默认屏蔽;它只对 Set-Cookie、WWW-Authenticate、Expires、Cache-Control 等内置屏蔽列表中的头生效,且优先级低于 proxy_hide_header。
哪些响应头会被默认忽略?
Nginx 为安全和协议兼容性,默认不把以下响应头转发给客户端:
- Set-Cookie(尤其当上游未设 Domain/Path 或跨域时易被丢)
- WWW-Authenticate
- Expires 和 Cache-Control(部分缓存场景下)
- Connection、Keep-Alive、Proxy-Authenticate 等 hop-by-hop 头
正确写法:在 location 中显式启用
proxy_pass_header 必须放在 proxy_pass 同一作用域(如 location 块内),且只能用于响应头。例如:
location /api/ {
proxy_pass https://backend;
proxy_pass_header Set-Cookie;
proxy_pass_header WWW-Authenticate;
proxy_pass_header Expires;
}
⚠️ 注意:它不会恢复已被 proxy_hide_header Set-Cookie; 主动隐藏的头——后者优先级更高,会直接覆盖前者。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
替代方案(推荐用于新版本)
从 Nginx 1.19.1 起,proxy_pass_header 已被标记为 deprecated。更推荐用反向控制逻辑:
- 先清空默认屏蔽行为(无需显式放行)
- 再按需用 proxy_hide_header 隐藏个别不想透传的头
示例:
location /api/ {
proxy_pass https://backend;
# 默认不再自动过滤 Set-Cookie、Cache-Control 等
# 只隐藏你明确不想暴露的头,比如:
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
}
前提是没配置 proxy_hide_header Set-Cookie; ——否则它照样被删。
其他干扰因素必须排查
即使写了 proxy_pass_header,仍可能“失效”,常见原因有:
- proxy_ignore_headers 正在起作用(如 proxy_ignore_headers Set-Cookie; 会阻止透传,也影响缓存)
- 后端返回的 Cookie 缺少 Path/Domain,或含 HttpOnly/Secure 标志但 Nginx 版本较旧
- 启用了 proxy_cookie_path 或 proxy_cookie_domain,触发了自动重写或丢弃
- 请求头含下划线(如
X-App_Code),而未开启 underscores_in_headers on;(虽不影响响应头,但常被一并排查)










