proxy_set_header 本身不区分内外调用,但可通过设置自定义请求头(如 x-call-source)向后端传递来源标识;推荐用 map 指令结合 ip 段动态赋值,避免 if 误用;它仅传递信息,访问控制需配合 allow/deny 实现。

proxy_set_header 本身不直接“区分”内部与外部调用,但它能帮你把区分所需的标识准确传递给后端服务。关键在于:用它往发往后端的请求头里,添加一个可识别的、稳定的标记字段,让后端代码根据这个字段做逻辑判断。
用自定义 Header 标记来源
最常用也最可靠的方式,是在 Nginx 配置中为不同来源的请求设置不同的自定义请求头,比如 X-Call-Source 或 X-Proxy-Source:
- 对来自公网的请求(外部),在对应 location 块中设置:
proxy_set_header X-Call-Source "external"; - 对来自内网 IP 的请求(内部),单独配置 location 或用 if 判断(需谨慎),设置:
proxy_set_header X-Call-Source "internal";
后端应用收到请求后,只需读取 X-Call-Source 的值即可明确调用来源,无需解析 IP 段或依赖 Host 头。
结合 IP 段做条件设置
如果你希望更细粒度地控制,可以配合 map 指令或 if + proxy_set_header 实现动态赋值:
- 先用
map定义变量:map $remote_addr $call_source {<br> default "external";<br> 10.0.0.0/8 "internal";<br> 172.16.0.0/12 "internal";<br> 192.168.0.0/16 "internal";<br>} - 再在 proxy_pass 块中使用:
proxy_set_header X-Call-Source $call_source;
这样既避免了重复写多段 location,又保持了配置清晰和可维护性。
别混淆 proxy_set_header 和访问控制
注意:proxy_set_header 只负责“传递信息”,不控制访问权限。区分调用来源 ≠ 允许或拒绝访问:
- 真正做访问控制(如只允许内网调用某接口),要用
allow/deny指令,放在 location 块里 - 而 proxy_set_header 是把“这个请求是谁来的”这件事告诉后端,让后端决定是否放行、记录日志、走不同业务分支等
- 两者常配合使用,但职责完全分离
常见误用提醒
容易出错的地方包括:
- 把
add_header当作区分依据——它加的是响应头,浏览器能看到,后端收不到,无法用于服务端逻辑判断 - 依赖
$host或$http_host判断来源——这些值可能被客户端伪造,不可信 - 没清空默认 header 导致冲突——Nginx 默认会重写某些 header(如 Host),建议显式设置
proxy_set_header Host $http_host;保证一致性











