add_header默认仅对200、201、204、206、301–304、307、308等响应生效,4xx/5xx错误响应不携带;加always参数可强制在所有状态码下发送,如add_header x-env "staging" always。

add_header 只在特定状态码下生效,不是所有响应都带
默认情况下,add_header 仅对 200、201、204、206、301–304、307、308 这些成功或重定向响应生效。如果你的接口返回 400、401、500 等错误码,这些自定义 Header 就不会出现在响应里——这是最常被忽略的行为。
解决办法是加 always 参数:
add_header X-Env "staging" always;
这样无论后端返回什么状态码,Header 都会透出。但要注意:某些安全敏感 Header(如 Set-Cookie)加 always 可能被浏览器拒绝,需结合业务判断。
- 不加
always:适合只在正常响应中透出的业务标识(如X-Request-ID) - 加
always:适合调试类 Header(如X-Backend、X-Route)或监控埋点 - 若用在
location块中,会覆盖server级同名 Header;没声明则继承上级
多个域名要差异化 Header,别硬写一堆 server 块
当有 api.example.com、admin.example.com、docs.example.com 时,直接在每个 server 里重复写 add_header X-Service "xxx" 不仅难维护,还容易漏配或写错。
推荐用 map 在 http 块预定义变量:
map $host $x_service {<br> api.example.com "api";<br> admin.example.com "admin";<br> docs.example.com "docs";<br> default "unknown";<br>}
然后在任意 server 或 location 中复用:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
add_header X-Service $x_service;
-
map必须写在http块内,不能放在server或location里 - 匹配是精确字符串比对,不支持通配符(
*.example.com需用正则~^.*\.example\.com$) - 变量值为空时,Header 不会发出;
default是兜底项,建议始终设置
想往请求头(Request Header)里加字段?proxy_set_header 才是正解
很多人误以为 add_header 能改客户端发来的请求头——它只能操作 Nginx 发给客户端的响应头。真正要向后端注入请求头(比如让 Node.js 的 req.headers['x-domain'] 拿到当前域名),必须用 proxy_set_header。
典型配置:
location / {<br> proxy_pass https://backend;<br> proxy_set_header X-Domain $host;<br> proxy_set_header X-Real-IP $remote_addr;<br>}
-
proxy_set_header会覆盖原始请求头,例如proxy_set_header Host $host会让后端看到的是 Nginx 的Host,而非客户端原始值 - 若需保留原始
User-Agent,显式写proxy_set_header User-Agent $http_user_agent - 非标准 Header 名(如
X-Tenant-ID)默认会被 Nginx 过滤,需在http块加underscores_in_headers on;(仅当 Header 含下划线时需要)
add_trailer 和 add_header 的区别不只是位置
add_trailer 确实把 Header 放在响应体末尾,但它只适用于分块传输(chunked encoding)且响应体较大的场景,比如流式 API、大文件下载进度通知。普通 JSON 接口几乎用不到。
关键限制:
- 不支持
always参数(Nginx 1.19+ 才支持) - 仅对 200、201、206、301–303、307–308 生效,且要求响应体未被压缩(gzip 关闭或未触发)
- 浏览器开发者工具里看不到它,得用
curl -i或抓包工具查
除非你在做视频流、SSE 或自定义协议透传,否则优先用 add_header。别为了“末尾”这个字眼强行用 add_trailer。










