nginx中map用于生成决策变量而非直接操作请求头,配合proxy_set_header、proxy_hide_header实现轻量、高性能的条件化头字段增减;需定义在http块顶层,设default值,源变量自动转为小写下划线格式。

Nginx 中结合 map 动态控制请求头的增减,核心不是让 map 直接操作头字段,而是用它生成“决策变量”,再配合 proxy_set_header、proxy_hide_header 或 unset(需第三方模块)实现条件化透传或屏蔽。整个过程轻量、无 if、性能高。
用 map 提取关键特征,生成透传开关或精简值
map 适合从原始请求头中提取、清洗、归类信息,输出一个可用于判断的变量。例如:
- 把
X-Env: staging映射为$should_log="true",后续只在 staging 环境透传调试头 - 从
Authorization: Bearer abc123中剥离前缀,得到$clean_token="abc123" - 根据
X-Forwarded-For提取首跳 IP,生成$real_client_ip,避免透传整串链路 IP
示例配置(放在 http 块顶层):
default "";
~^Bearer\s+(.+)$ $1;
}
用 proxy_set_header 动态透传最小必要头
在 location 或 server 块中,只显式设置真正需要的头字段,不写就等于不透传。map 变量可直接用于赋值:
-
proxy_set_header Authorization $clean_token;—— 仅透传清洗后的 token -
proxy_set_header X-Real-IP $real_client_ip;—— 只传可信源 IP -
proxy_set_header X-Env $http_x_env;—— 有则传,无则为空(后端可按空值降级)
这样既避免了全量透传 Authorization 或 X-Forwarded-For 带来的安全与解析开销,也防止后端因收到冗余字段而误判。
用 proxy_hide_header + map 控制敏感响应头是否暴露
后端返回的某些头(如 Server、X-Powered-By、X-Internal-Version)不该返回给客户端。map 可用来标记“当前是否对外服务”,再决定是否隐藏:
default "off";
"true" "on";
}
然后在 location 中:
proxy_hide_header Server;proxy_hide_header X-Powered-By;- 若需更精细控制(比如仅对公网请求隐藏),可配合
if ($hide_internal_headers = "on") { ... },但注意该 if 仅用于 header 操作,不影响路由逻辑
避免常见陷阱
- map 必须定义在
http块顶层,不能放在 server 或 location 内 - 所有 map 的源变量(如
$http_x_env)自动小写+下划线,X-Env →$http_x_env - 未匹配时一定要设
default,否则变量为空,可能导致 502 或空头透传 - proxy_set_header 不支持嵌套 if,所以 map 是唯一推荐的前置决策方式











