我是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“with”my-header“,authserver将授权”my-header“并回复基于JSON的响应,如:
{
valid: "true"/"false";
}
然后我需要根据响应“有效”值来决定proxy_pass请求到nginx后面的myservice或直接拒绝403 http响应。
答案 0 :(得分:0)
您需要根据nginx发出子请求。
您可以使用其中一个Eval模块,然后通过regexp解析响应,但不建议这样做。
推荐的方法是使用http://wiki.nginx.org/HttpLuaModule。 看一下http://openresty.org nginx bundle。
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发出的子请求默认会继承当前请求的所有请求标头。