Nginx 默认丢弃 Authorization 请求头,需显式配置 proxy_set_header Authorization $http_authorization;,变量名必须为小写带下划线,且确保未禁用 proxy_pass_request_headers。

默认情况下,Nginx 在代理转发(proxy_pass)时会**丢弃** Authorization 请求头,这是出于安全考虑的内置行为。要让后端服务能收到该头,必须显式配置 Nginx 透传它。
确保 proxy_set_header 正确设置 Authorization 头
Nginx 不会自动继承原始请求中的 Authorization,需手动用 proxy_set_header 显式传递:
- 在
location或server块中添加:proxy_set_header Authorization $http_authorization; - 注意变量名是
$http_authorization(小写下划线,且自动转为小写),不是$http_Authorization或$auth - 如果用了 Basic 认证,该变量值形如
Basic base64string;如果是 Bearer Token,则为Bearer xxx
避免被 proxy_pass 自动清除(关键:禁用 proxy_pass_request_headers 的干扰)
正常情况下无需关闭 proxy_pass_request_headers(它默认为 on),但如果你之前设为 off,则所有请求头都会被丢弃——包括你手动设置的 Authorization。务必确认:
- 没有配置
proxy_pass_request_headers off; - 若存在该配置,请删掉或改为
on
验证是否生效(简单调试方法)
可在后端服务日志或调试接口中打印接收到的请求头,或用 curl 搭配 Nginx 日志观察:
- 在 Nginx 配置中临时加一条日志:
log_format debug '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_authorization"';
再在access_log中使用该格式 - 发起带认证的请求:
curl -H "Authorization: Bearer abc123" http://your-domain/api - 检查 access.log 是否记录了
Bearer abc123
补充:处理带下划线的 header 名(可选,仅当后端依赖下划线时)
某些旧版框架(如部分 Python WSGI 实现)可能把 Authorization 解析为 HTTP_AUTHORIZATION,而 Nginx 默认将含连字符/大写的 header 转为下划线大写形式。若后端读不到,可尝试:
- 启用
underscores_in_headers on;(放在http或server块) - 同时确保后端代码明确从
HTTP_AUTHORIZATION读取(而非AUTHORIZATION)


















