Nginx auth_request无法获取返回请求头与状态码问题咨询
问题原因
你的配置存在3个核心问题,导致无法拿到预期的响应头:
- auth子请求
/test-auth直接通过return指令在Nginx内部返回,没有经过上游转发流程,$upstream_*系列变量只有请求实际发送到上游服务时才会赋值,所以你无法通过auth_request_set捕获到任何子请求的响应头和状态码 - 变量名使用错误:
$sent_http_前缀对应的是主请求要返回给客户端的响应头,和auth子请求无关,无法用来获取子请求的返回值 - 上游content服务返回的
X-Test3头不会自动和你在/proxylocation中配置的add_header合并,Nginx的add_header存在层级覆盖规则,当前层级配置了add_header后,不会自动继承上游或上层配置的响应头,需要显式声明返回
解决方案
修改配置如下即可实现需求:
- 新增一个本地server专门处理auth请求的返回,让auth子请求走上游转发流程,生成对应的
$upstream_*变量
server { listen 4002; # 加always参数保证所有响应码都返回该头 add_header X-Test "testvalue" always; return 200; }
- 修改
/test-authlocation的配置,转发到刚才新增的本地auth服务
location /test-auth { proxy_pass http://127.0.0.1:4002; # 不需要传递请求体,优化性能 proxy_pass_request_body off; proxy_set_header Content-Length ""; }
- 修正
/proxylocation的配置,调整变量引用和响应头配置
location /proxy { auth_request /test-auth; # 用$upstream_http_x_test取auth子请求的响应头,横杠转下划线,全小写 auth_request_set $test $upstream_http_x_test; # 取auth子请求的响应状态码 auth_request_set $test2 $upstream_status; add_header X-Test1 "test1" always; add_header X-Test $test always; add_header X-Test2 $test2 always; # 显式取content上游返回的X-Test3头返回给客户端 add_header X-Test3 $upstream_http_x_test3 always; proxy_pass http://content?test=$test&test2=$test2; proxy_pass_request_body off; }
修改完成后重载Nginx配置,再次请求/proxy即可拿到全部4个预期响应头,同时proxy_pass的参数也会携带正确的$test和$test2值。
内容的提问来源于stack exchange,提问作者Alexander Pravdin
相关产品推荐
相关产品推荐

