Nginx auth_request异常:访问主路径403,直接访问认证路径返回200
Nginx auth_request 子请求参数传递问题解析
问题原因
你遇到的现象核心是Nginx的子请求不会自动继承父请求的Query参数,且变量是请求级别的(每个请求包括子请求都有独立的变量副本):
- 直接访问
http://127.0.0.1:8080/myauth?k=test时,这是一个独立请求,server块的set $myk $arg_k会将$arg_k(即test)赋值给$myk,此时$digest与$myk相等,返回200。 - 访问
http://127.0.0.1:8080/?k=test时,主请求的$myk确实是test,但auth_request发起的是内部子请求,子请求的URI是/myauth(不带?k=test参数),因此子请求的$arg_k为空。而server块的set $myk $arg_k会在子请求处理时重新执行,导致子请求的$myk是空字符串,此时$digest(test)与空的$myk不相等,触发403返回。
解决方法
方法1:在auth_request中直接传递Query参数
修改主location的auth_request指令,将父请求的k参数传递给子请求:
location / { auth_request /myauth?k=$arg_k; proxy_pass http://nginxcluster/; }
这样子请求的URI会带上?k=test,$myk就能被正确赋值为test,对比通过后返回200。
方法2:通过自定义Header传递参数
如果需要传递多个参数或不想暴露参数在子请求URI中,可以在主请求中添加自定义Header,在auth子请求中读取该Header:
location / { auth_request /myauth; # 传递k参数到子请求的Header proxy_set_header X-K $arg_k; proxy_pass http://nginxcluster/; } location = /myauth { #internal; default_type 'text/plain'; proxy_set_header X-Original-URI $request_uri; proxy_set_header X-Original-METHOD $request_method; proxy_pass_request_body off; proxy_set_header Content-Length ""; set $digest "test"; # 读取主请求传递的Header值 if ($digest != $http_x_k){ echo $digest; echo $http_x_k; return 403; } return 200; }
内容的提问来源于stack exchange,提问作者xsmyqf
相关产品推荐
相关产品推荐

