Nginx 中 proxy_set_header 可通过 map 和 set 指令动态构造 Token:用 map 提取 Bearer Token 或按 IP/域名分流,用 set 拼接前缀;需显式清空原始敏感头,避免注入风险。

在 Nginx 中,proxy_set_header 本身不支持直接动态读取请求头并拼接字符串(比如把原始 Token 拆解或加前缀),但它可以通过变量组合实现“动态传递自定义 Token”——关键在于利用内置变量(如 $http_authorization、$http_x_api_token)和自定义变量(配合 map 或 set 指令)灵活构造目标 Header。
从原始请求头提取并透传 Token
最常见场景是客户端带 Authorization: Bearer xxx 或 X-API-Token: abc123,后端服务需要统一的 X-Auth-Token。可直接引用变量:
- 透传 Bearer Token(去掉
Bearer前缀)需用map拆解,Nginx 本身不支持字符串截断,所以推荐用map+ 正则提取:
map $http_authorization $token_from_auth {
~^Bearer\s+(.+)$ $1;
default "";
}然后在 location 中使用:
location /api/ {
proxy_pass https://backend;
proxy_set_header X-Auth-Token $token_from_auth;
}- 若客户端直接传
X-API-Token,更简单:
proxy_set_header X-Auth-Token $http_x_api_token;
拼接固定前缀或环境标识
有些业务要求 Token 带环境标记(如 prod_abc123),可用 set 指令组合(需启用 ngx_http_rewrite_module):
location /api/ {
set $final_token "prod_$http_x_api_token";
proxy_pass https://backend;
proxy_set_header X-Auth-Token $final_token;
}注意:set 必须在 location 内,且不能在 if 块中用于 proxy_set_header(有作用域限制)。
根据来源 IP 或域名做 Token 转换
例如内网调用走明文 Token,外网强制用 JWT,可通过 map 区分:
map $remote_addr $upstream_token {
~^10\. $http_x_internal_token; # 内网 IP
default $jwt_token; # 兜底变量(由另一个 map 生成)
}
<p>map $http_authorization $jwt_token {
~^Bearer\s+(.+)$ $1;
default "";
}</p>再在 proxy 中引用:
proxy_set_header X-Auth-Token $upstream_token;
安全提醒:避免泄露敏感头
务必显式清除或覆盖可能暴露的原始头:
- 用
proxy_set_header Authorization ""清空原始 Authorization,防止被后端误用 - 不要用
$http_*变量直接透传未校验的用户输入(如$http_cookie),可能引发注入 - Token 类 Header 建议只在必要 location 中设置,避免全局污染
不复杂但容易忽略。











