Nginx server块中头部处理需区分请求头与响应头:proxy_hide_header仅屏蔽后端响应头;add_header控制客户端响应头(加always可作用于错误响应);proxy_set_header修改发往后端的请求头;复杂逻辑需OpenResty或Nginx Plus。

在 Nginx 的 server 块中设置自定义头部信息过滤规则,核心是区分“请求头处理”和“响应头处理”,并选用对应指令——不是所有头都能用同一方式控制,也不能靠猜测生效。
只删不改:用 proxy_hide_header 清除后端返回的响应头
该指令专用于反向代理场景,作用是彻底屏蔽后端服务返回的特定响应头,Nginx 不会将其发给客户端。它只能写在 server 或 location 块内,且不支持条件或正则。
- 常见用法:
proxy_hide_header X-Powered-By;、proxy_hide_header Server; - 注意:它对 Nginx 自己生成的头(如
Date、Content-Length)无效;也不能删除Set-Cookie等受浏览器策略限制的头 - 若需隐藏
Server,更推荐全局配置server_tokens off;(放在http块)
精准添加或覆盖:用 add_header 控制发给客户端的响应头
add_header 是你在 server 块里最常用的操作,但它有明确限制:默认只对成功类状态码(200、204、301–304、307、308)生效,4xx/5xx 错误响应中不会出现。
- 基础写法:
add_header X-Content-Type-Options "nosniff"; - 让错误响应也生效:加
always参数,例如add_header X-Backend "nginx" always; - 注意继承性:
server块里的add_header不会自动被其下的location继承;每个location需单独声明,或用map变量统一注入
修改或透传客户端请求头:用 proxy_set_header 控制发往后端的头
这是真正意义上的“请求头过滤”——你决定哪些头要传、怎么传、是否重写。它只影响 Nginx 转发给 upstream 的请求,不影响客户端到 Nginx 这一段。
- 透传原始值:
proxy_set_header X-Real-IP $remote_addr; - 覆盖 Host:
proxy_set_header Host $host;(避免后端看到 upstream 名) - 删除某个头:
proxy_set_header Accept-Encoding "";(空字符串 = 彻底移除) - 慎用:不要用
proxy_set_header操作敏感头如Cookie或Authorization,除非你明确知道业务逻辑和安全边界
需要深度过滤?原生 server 块做不到,得换方案
如果你的需求超出静态增删,比如:
- 只在 500 响应中删除
X-Debug - 把
X-User-ID: 123改成X-Anonymized-ID: abc - 根据响应体内容动态加头
那么仅靠 server 块内的标准指令无法实现。必须引入扩展能力:
- 生产环境首选:OpenResty +
header_filter_by_lua_block,可读取、判断、正则、调用外部服务 - 企业级选型:Nginx Plus(商业版,支持
more_set_headers等高级指令) - 不建议硬改源码或自己写 filter 模块,维护成本高、升级风险大


















