Nginx auth请求意外状态404

时间:2018-02-14 12:41:18

标签: authentication nginx runtime-error http-status-code-404

当向nginx auth_request模块发送子请求时,我收到以下错误。 有关信息,我开发了一个基于Spring安全性的Web应用程序,它只包含一个Web方法,即验证用户凭据和会话,并以200或401错误代码进行响应。

成功验证页面被重定向到显示上游应用程序主页的主页面,而不是我在nginx日志中收到此错误,如下所示

错误 auth请求意外状态:404发送到客户端时,客户端:127.0.0.1,server :, request:" GET / HTTP / 1.1",host:" localhost:8180",referrer :" https://localhost:8180/login.html" *

此错误显示nginx已将完整请求的网址传递给auth子请求,而不是" / authenticate"并且auth服务会查找它无法在其中找到的资源并抛出404错误。

    server {
    listen    8180 ssl;
    ssl_certificate         certs/gcaa-nginx.pem;
    ssl_certificate_key     certs/gcaa-nginx.pem;

    location /{
        proxy_set_header x-sec-clnt "ap1";  
        auth_request /authenticate;
        proxy_pass https://adi-backend;         
    }

    location = /authenticate {
        proxy_set_header x-sec-clnt "ap1";  
        proxy_pass http://authserv;
    }

    location = /login.html {
        root   html;
    }

    location = /50x.html {
        root   html;
    }
    error_page   500 502 503 504  /50x.html;
    error_page  401 403 login.html;
}

2 个答案:

答案 0 :(得分:2)

文档说不支持从http://authserv返回状态404 Not Found。 ngx_http_auth_request_module仅需要2xx,401或403:

  

如果子请求返回2xx响应代码,则允许访问。如果它返回401或403,则拒绝访问,并显示相应的错误代码。 子请求返回的任何其他响应代码都被视为错误。

从这里开始:http://nginx.org/en/docs/http/ngx_http_auth_request_module.html

编写auth模块的人显然认为404意味着无法找到auth端点本身,例如auth请求被发送到错误的URL。而不是所要求的东西不存在。

因此,如果您不想在日志中出现这些错误,请使用除auth模块之外的其他内容。 ...

......也许是Lua? (https://github.com/openresty/lua-nginx-module)当我想要" auth"这是我正在做的事情。处理程序既做auth,也检查所请求的东西是否存在:

这是我的Lua方法(工作正常):

location ~ ^/-/u/([^/][^/]+/)(.*)$ {

  # (1. There's Nginx's http_auth_request_module module, but it handles upstream 404 Not Found
  # as an internal error. So it cannot both do auth, and check does-it-exist? at the same time.
  # 2. ngx.location.capture is synchronous, but non-blocking: the code execution stops, until
  # a response is received — but meanwhile, the nginx worker continues with other things.)
  set $publSiteId $1;
  set $hashPath $2;
  access_by_lua '
    response = ngx.location.capture("/_auth_upload/" .. ngx.var.publSiteId .. "/" .. ngx.var.hashPath)
    if response.status == 404 then
      ngx.status = 404
      ngx.say("Not found. [TyNGXFKB604]")
      return ngx.exit(ngx.OK)
    end
    if response.status == 401 or response.status == 403 then
      ngx.status = response.status
      ngx.say("Access denied. [TyNGX5KWA2]")
      return ngx.exit(ngx.OK)
    end';

  alias /opt/talkyard/uploads/public/$2;
  ... cache headers ...
}

这是Nginx子请求处理程序:

location /_auth_upload/ {
  # Only for Nginx subrequests.
  internal;
  proxy_pass              http://app:9000/-/auth-upload/;
  proxy_pass_request_body off;
  proxy_set_header        Content-Length "";
  proxy_set_header        X-Original-URI $request_uri;
}

完整来源here。我希望这会有所帮助: - )

答案 1 :(得分:1)

这可能对我有帮助... 就我而言,更改

location = /authenticate {
        proxy_set_header xclnt "ap1";  
        proxy_pass http://authserv;
    }

location = /authenticate {
        proxy_set_header xclnt "ap1";  
        proxy_pass http://authserv/;
    }

(proxy_pass中URL末尾的斜杠)解决了该问题...