Nginx 307跳转携带Authorization Bearer Token失败如何解决
问题原因
你之前的配置不生效核心原因是**return 30x 是Nginx直接向客户端返回重定向响应,后续请求是客户端主动发起的,完全不会走Nginx反向代理逻辑**,你加的proxy_set_header、proxy_pass_header都是proxy_pass反向代理场景下的指令,配在return重定向的location块里不会执行。
另外307跳转虽然规范要求保留请求方法和请求体,但跨域重定向场景下Authorization这类敏感头是否携带完全由客户端(浏览器/接口调用方)的安全策略决定,Nginx无法强制客户端在跳转后的请求里携带指定头。
可选实现方案
根据你是否需要让客户端感知跳转,选对应配置即可:
方案1:服务端隐式转发(推荐,Authorization头100%透传)
不需要客户端感知跳转,地址栏保持原请求地址,Nginx在服务端直接把请求转发到目标地址,完全控制转发请求头,配置如下:
location ~* /api/(abc_.+)/policy/ { # 透传原始请求的Authorization头到目标服务 proxy_set_header Authorization $http_authorization; proxy_set_header Host xyz.in; # 透传客户端真实IP等信息可按需开启 # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://xyz.in/policy/; proxy_redirect off; }
方案2:真实307重定向(客户端地址栏变更为目标URL)
如果必须返回307让客户端跳转到新域名,Nginx无法直接修改客户端跳转请求的头,只能把Token拼到重定向URL参数里传递,需要目标服务支持从URL参数读取Token,配置如下:
location ~* /api/(abc_.+)/policy/ { # 从请求头提取Bearer后的Token内容 if ($http_authorization ~* ^Bearer\s+(.*)$) { set $access_token $1; return 307 https://xyz.in/policy/?token=$access_token; } # 原始请求未携带Authorization头直接返回鉴权失败 return 401 '{"message": "Authorization token missing"}'; }
之前配置无效的补充说明
你之前写的proxy_set_header Authorization "Bearer $arg_token";逻辑是从当前请求的URL参数token 里取值拼接Bearer头,只有当你请求原Nginx地址时携带了?token=xxx参数,且使用proxy_pass做转发时才会生效,搭配return 307使用时完全不会执行该逻辑。
内容的提问来源于stack exchange,提问作者PVR
相关产品推荐
相关产品推荐

