如何使用Nginx和Lua操纵POST请求的JSON主体?

我正在进行概念验证,以展示如何在我们的堆栈中实现3scale。 在一个例子中,我想进行一些POST 请求正文操作,以创建一个API外观,将可能是遗留API格式映射到新的内部API。例如。将像下面这样的东西改变一些东西

{ “foo”:“bar”,“deprecated”:true}

变成

{ “FOO”:“bar”}

content_by_lua的Lua模块文档似乎是适当的方法,说

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

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

我认为没有办法删除proxy_pass,因为这是代理工作的基础,因此是否可以在单独的位置捕获请求,使用content_by_lua,然后转到实施proxy_pass的位置,或者是否有不同的方法像更合适的rewrite_by_lua


如果有人有帮助,我添加了以下功能(我的第一个Lua),以删除3scale要求进行授权但对我们的API无效的“user_key”参数:

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
点赞
用户1850358
用户1850358

我建议你使用 access_by_lua

在 nginx.conf 文件中

location / {
                #host and port to fastcgi server
                default_type text/html;
                set $URL "http://$http_host$request_uri";
                access_by_lua_file /home/lua/cache.lua;
                proxy_pass http://$target;
                -------
                ---------

在 cache.lua 文件中,你可以做一些像这样的事情:

if ngx.req.get_method() == "POST" then
    -- 检查请求方法是否为 POST
    -- 实现你的逻辑
    return
end
2014-04-01 14:22:01
用户1956543
用户1956543

继 Prashant 已经提到的内容之后,当您从 3scale 下载 Nginx 配置文件时,您会发现其中包含一个 Lua 文件。该文件已经从 access_by_lua_file 开始调用。

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

此外,这篇文章是一篇关于如何使用 Nginx 中的 Lua 实现对请求进行不同转换的深度技术博客文章。

2014-04-02 11:02:20
用户4718508
用户4718508

最近我需要根据 post 请求中的 JSON 值来操作 upstream,我发现这篇文章很有用:NGINX LUA and JSON

这是基本的配置,但可以给你一个实现的思路。

2015-03-26 22:02:59