我正在做一个概念验证,以演示我们如何在堆栈中实现 3scale。在一个示例中,我想执行一些 POST 请求正文操作,以创建一个 API 外观,该外观将可能是旧 API 格式的内容映射到新的内部格式。例如。更改类似内容
{ "foo" : "bar" , "deprecated" : true }
到
{ "FOO" : "bar" }
Lua 模块文档用于content_by_lua,这似乎是合适的方法
不要在同一位置使用此指令和其他内容处理程序指令。例如,此指令和 proxy_pass 指令不应在同一位置使用。
我的理解是,content_by_lua是像proxy_pass这样的内容处理程序,每个位置只能使用其中一个。
我认为没有任何方法可以删除proxy_pass因为这是代理工作的基础,那么是否可以在单独的位置捕获请求,使用 content_by_lua,然后传递到实现proxy_pass的位置,或者是否有不同的方法,例如 rewrite_by_lua 哪个更合适?
如果它对其他人有帮助,我添加了以下函数(我的 Lua 的第一个位),它删除了 3scale 授权所需的 user_key
参数,但如果转发,则对我们的 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
我建议你使用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 -- 实现你的逻辑 返回结束
补充Prashant已经提到的内容:当您从3scale下载Nginx配置文件时,您会注意到其中包含一个Lua文件。已从 access_by_lua_file
调用此文件。
在我看来,该文件是添加身体操作代码的最佳位置。它将在发送到 API 服务器的proxy_pass
之前为每个请求执行。
此外,这是一篇非常好的深入博客文章,介绍如何在 Nginx 中使用 Lua 完成对请求的不同转换:
最近我不得不根据 post request 中的 JSON 值操作上游,我发现这很有用: NGINX LUA 和 JSON
这是基本配置,但给出了如何做到这一点的想法。