0

我是 Nginx 的新手,我的要求差不多是这样的:

我在我的服务之前将 Nginx 设置为前端服务,这就像一个反向代理服务器,而我需要根据传入的客户标头处理任何传入的 http 请求。我知道我可以设置反向代理,如下所示:

server {
    listen      18080;
    server_name localhost;

    location /myService {
            proxy_pass http://host:port/myservice/;
    }

}

我也知道通过使用 $http_my_header 从传入请求中获取传入的“my-header”,我需要的是,从请求中检索“my-header”,然后调用另一个远程 Web 服务,如“http://authserver:authport/authorize ” 在请求标头中带有“my-header”,authserver 将授权“my-header”并回复基于 JSON 的响应,例如:

{
   valid: "true"/"false";
}

然后我需要根据响应“有效”值来决定 proxy_pass 请求到 nginx 后面的 myservice 或直接拒绝 403 http 响应。

4

1 回答 1

0

您需要根据 nginx 发出子请求。

您可以使用 Eval 模块之一执行此操作,然后通过正则表达式解析响应,但不建议这样做。

推荐的方法是使用http://wiki.nginx.org/HttpLuaModule。看看http://openresty.org nginx 包。

init_by_lua 'require "cjson"';

location /auth {
    proxy_pass http://authserver:12345/authorize;
}
location /myService {
    access_by_lua '
        res = ngx.location.capture("/auth")
        if res.status == ngx.HTTP_OK then
            local response = cjson.decode( res.body )
            if response.valid and response.valid == "true" then
                return
            end
        end
        ngx.exit(ngx.HTTP_FORBIDDEN)
    ';
    proxy_pass http://host:port/myservice/;
}

注意 ngx.location.capture 发出的子请求默认继承当前请求的所有请求头。

于 2013-03-11T15:46:46.077 回答