代码之家  ›  专栏  ›  技术社区  ›  Teoman shipahi

在Nginx location部分调用外部api

  •  0
  • Teoman shipahi  · 技术社区  · 6 年前

    我需要下面这样的东西;
    示例来自: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

    location /proxy-pass-uri {
        set $urlToProxy = CallWebAPI("http://localhost:8081/resolver?url=" + $url);
        proxy_pass $urlToProxy;         
    }
    

    所以,我的问题是,是否可以发出HTTP请求或编写CallWebAPI之类的方法?

    我知道这可能是一个不好的做法,但我正在处理的网站有数千个网址,这些网址被映射为键值对,其中90%不遵守任何特定的regex规则。所以我有一个内容映射数据库,我需要动态获取包含内容的传入url。

    我正在尝试使用一个非常简单的web服务从redis中查找url,并返回代理url。

    这是一个有效的场景,还是nginx中有其他类似的内置解决方案?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ivan Shatsky    6 年前

    openresty ngx_http_lua_module ngx.location.capture 方法。例如:

    resolver 8.8.8.8;
    location ~/proxy-pass-uri(/.*)$ {
        set $url $1;
        set $proxy "";
        access_by_lua_block {
           res = ngx.location.capture("http://localhost:8081/resolver?url=" .. ngx.var.url)
           ngx.var.proxy = res.body
        }
        proxy_pass $proxy$url;
    }
    

    还有一个 ngx_http_js_module ( documentation , GitHub )有能力做子请求的( example ),但我从未用过,也不知道是否可以这样用。