nginx 通过 proxy_set_header 转发鉴权 token,需用 $http_authorization 变量原样透传客户端 authorization 头,或借助 map 指令从 cookie 等提取并构造,同时注意清理无关头以确保安全与准确性。

在 Nginx 中通过 proxy_set_header 携带鉴权 Token,核心是把客户端请求中携带的 Token(比如放在 Authorization 头或自定义头如 X-Auth-Token)原样或稍作处理后,转发给上游服务。
从客户端请求中提取 Token 并透传
最常见场景是客户端在请求头中带 Authorization: Bearer xxx,Nginx 需原样转发给后端:
- 确保客户端确实发送了该头部(浏览器、curl 或 SDK 需主动设置)
- 在
location块中添加:proxy_set_header Authorization $http_authorization; -
$http_authorization是 Nginx 内置变量,自动映射请求头Authorization的值
从 Cookie 或其他头中提取并构造 Token 头
若 Token 存在 Cookie(如 token=abc123)或自定义头(如 X-Api-Token),可借助 map 指令预处理:
- 在
http块顶部定义映射:
map $cookie_token $backend_token {
"" "";
default "Bearer $cookie_token";
}- 在
location中使用:proxy_set_header Authorization $backend_token; - 这样当 Cookie 含
token=abc123,上游收到的就是Authorization: Bearer abc123
注意清除或覆盖默认头
Nginx 默认不发送 Authorization 头,但某些部署中可能被其他配置干扰。安全起见可显式清理无关头:
- 避免泄露敏感信息:
proxy_set_header X-Real-IP "";(清空某头) - 强制设置固定值(不推荐用于 Token,仅作参考):
proxy_set_header Authorization "Bearer static-secret"; - 更稳妥的做法是只转发必要头,禁用未声明的头:
proxy_pass_request_headers on;(默认为 on,无需重复写)
验证是否生效
调试时可在 upstream 服务日志或用 curl -v 查看实际收到的请求头:
- 在 Nginx 配置中临时加日志:
log_format debug '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_authorization"'; - 重启 Nginx 后观察 access log,确认
$http_authorization是否有值 - 后端收到的
Authorization头应与客户端发出的一致(除非 map 逻辑做了转换)











