18

我正在做一个概念证明来演示我们如何在我们的堆栈中实现3scale 。在一个示例中,我想做一些 POST请求正文操作,以创建一个 API 外观,将可能是旧 API 格式的内容映射到新的内部格式。例如。改变类似的东西

{ "foo" : "bar" , "deprecated" : true }

进入

{ "FOO" : "bar" }

content_by_luaLua 模块文档,这似乎是合适的方法

不要在同一位置使用此指令和其他内容处理程序指令。例如,此指令和proxy_pass指令不应在同一位置使用。

我的理解是 content_by_lua 是一个类似于 proxy_pass 的内容处理程序,每个位置只能使用其中一个。

我认为没有任何方法可以删除proxy_pass,因为这是代理工作的基础,所以是否可以在单独的位置捕获请求,使用content_by_lua,然后传递到实现proxy_pass的位置,或者是否有不同的方法,如rewrite_by_lua哪个更合适?


如果它对其他人有帮助,我添加了以下函数(我的 Lua 的第一个位),它删除了user_key3scale 授权所需的参数,但如果转发则对我们的 API 无效:

function remove_user_key()
  ngx.req.read_body()
  -- log the original body so we can compare to the new one later
  local oldbody = ngx.req.get_body_data()
  log(oldbody)
  -- grab the POST parameters as a table
  local params = ngx.req.get_post_args()

  -- build up the new JSON string
  local newbody = "{"

   for k,v in pairs(params) do
     -- add all the params we want to keep
     if k ~= "user_key" then
        log("adding"..k.." as "..v)
        newbody = newbody..'"'..k..'":"'..v..'",'
     else 
        log("not adding user_key")
     end
   end
  --remove the last trailing comma before closing this off
  newbody = string.sub(newbody, 0, #newbody-1)
  newbody = newbody.."}"

  ngx.req.set_body_data(newbody)
  log(newbody)
end

if ngx.req.get_method() == "POST" then
  remove_user_key()
end
4

3 回答 3

8

我会建议你access_by_lua
在 nginx.conf 中使用

地点 / {
                #host 和端口到 fastcgi 服务器
                default_type 文本/html;
                设置 $URL "http://$http_host$request_uri";
                access_by_lua_file /home/lua/cache.lua;
                proxy_pass http://$target;
                --------
                ---------

在 cache.lua 文件中,您可以执行以下操作:

如果 ngx.req.get_method() == "POST" 那么
    -- 检查请求方法是否为 POST
    -- 实现你的逻辑
    返回
结尾
于 2014-04-01T14:22:01.473 回答
4

添加到 Prashant 已经提到的内容:当您从 3scale 下载 Nginx 配置文件时,您会注意到其中包含一个 Lua 文件。该文件已被从 调用access_by_lua_file

我认为该文件是添加身体操作代码的最佳位置。proxy_pass在发送到您的 API 服务器之前,它将为每个请求执行。

此外,是一篇非常好的深入博客文章,介绍了如何在 Nginx 中使用 Lua 对您的请求进行不同的转换:

于 2014-04-02T11:02:20.510 回答
0

最近我不得不根据发布请求中的 JSON 值来操作上游,我发现这很有用:NGINX LUA 和 JSON

这是基本配置,但给出了如何做的想法。

于 2015-03-26T22:02:59.380 回答