proxy_set_header必须位于location或server块内且与proxy_pass同级,location最安全;每行设一个头,值支持变量,子块同名指令会覆盖父块,不可放在http顶层以防意外继承。

proxy_set_header 的配置位置和结构直接影响请求头能否正确传递到后端。它不是写在任意地方都生效的,必须放在能触发代理行为的上下文中,并遵循明确的作用域规则。
必须放在 location 块内(最常用且推荐)
这是最安全、最清晰的做法。只有当请求匹配到某个 location,且该块中包含 proxy_pass 时,其内部的 proxy_set_header 才会被执行。
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}✅ 优点:作用范围精准,不会误影响其他路径;便于按业务路径差异化配置(比如
/admin/加鉴权头,/public/不传敏感头)。
可选放在 server 块内(全局对本虚拟主机生效)
适用于整个域名下所有代理请求都需统一透传的基础头。
server {
listen 443 ssl;
server_name example.com;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
proxy_pass http://backend;
}
}⚠️ 注意:若
location中也定义了同名proxy_set_header,会完全覆盖server级的设置(不是追加),所以需避免重复或冲突。
不建议放在 http 块顶层(易引发意外覆盖)
虽然语法合法,但一旦在 http 块中写了 proxy_set_header,它会作为默认值被所有 server 和 location 继承——除非子级显式重写。这容易导致:
- 某个
location忘记配置Host,结果继承了http级的错误值; - 多个不同后端服务共用一套 header,但实际需要不同
Host或不同认证头。
关键结构要点总结
-
proxy_set_header必须与proxy_pass在同一配置块(location最佳); - 每行只设一个头,格式为
proxy_set_header; -
可用变量(如$host、$scheme、$http_authorization),变量名必须准确(如$http_x_forwarded_for小写+下划线); - 同名指令在子块中会替换父块的值,不会合并;
- 若需条件性设置(例如仅当客户端带 Token 时才透传),应配合
map指令预生成变量,再在proxy_set_header中引用。
不复杂但容易忽略。


















