nginx默认不转发authorization头,需显式配置proxy_set_header authorization $http_authorization;为防空头应使用map预处理,也可从cookie或url参数提取构造;还需启用underscores_in_headers、确保cors允许及后端主动读取。

默认情况下,Nginx 不会转发 Authorization 请求头,即使你只写了 proxy_pass,这个头也会被静默丢弃。必须显式配置才能透传,否则后端收不到 Token,鉴权必然失败。
基础透传:原样转发客户端 Authorization 头
这是最常见也最关键的配置。客户端若携带 Authorization: Bearer xxx,Nginx 需用内置变量提取并设置:
- 在
location或server块中添加:proxy_set_header Authorization $http_authorization; - 变量名必须是
$http_authorization(全小写+下划线),不能写成$http_Authorization或$http_authorisation - 确认没有其他配置覆盖它,例如检查是否存在
proxy_set_header Authorization "";这类清空语句
安全兜底:避免空头覆盖导致鉴权中断
如果客户端没带 Authorization,$http_authorization 就是空字符串,直接赋值会让后端收到一个空的 Authorization: 头——这可能触发强制拒绝。更稳妥的做法是条件性传递:
- 用
map指令预处理:map $http_authorization $pass_auth {<br> "" ""; # 空值保持为空<br> default $http_authorization;<br>}
再写:proxy_set_header Authorization $pass_auth; - 不推荐在
location外使用if,且部分 Nginx 版本中if在 header 设置中不可靠
多源适配:从 Cookie 或 URL 参数提取并构造
当 Token 不在 Authorization 头里,而是存在 Cookie 或 query string 中时,可手动构造:
- 从 Cookie 提取(如
Cookie: token=abc123):proxy_set_header Authorization "Bearer $cookie_token"; - 从 URL 参数提取(仅限调试或特定场景):
proxy_set_header Authorization "Bearer $arg_token";(对应?token=abc123) - 组合判断更健壮:用
map定义优先级,例如先查$http_authorization,再 fallback 到$cookie_token
配套要点:确保传输链路可信
单靠透传还不够,还需注意几个关键协同点:
- 启用
underscores_in_headers on;,否则自定义含下划线的头(如X-Auth-Token)会被忽略 - 确认后端实际读取的是哪个头——Spring Security 默认只认
Authorization,不识别X-Auth-Token - HTTPS 下跨域请求需确保
Access-Control-Allow-Headers明确包含Authorization,否则浏览器不会发送 - 后端必须主动调用
request.getHeader("Authorization")类方法获取,不能依赖框架自动解析(尤其经代理后)











