You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:05:21