嗯,我的壁障是api并不是由nginx响应的。示例:
location = /test {
rewrite_by_lua '
uri_args = ngx.get_uri_args()
-- 从redis读取请求对应的api地址, 以及校验和
-- uri_args['api'] 实际只是一个api名字
api_url, api_sign = get_api_info_redis(uri_args['api'])
-- parsseArgs2Str 将请求中的所有字段拼接, 然后计算md5
local paramstr = parseArgs2Str()
local paramsign = ngx.md5(api_sign)
-- 校验并反向代理到真正的内网的api地址
if paramsign == api_sign then
ngx.exec(api_url)
end ';
}
问题来了,重点是:
api_url 对应的地址可能是fastcgi, 也可能是servlet, 不一定是nginx, 我不知道怎么去给返回值加上校验, 例如md5。
假如: api_url = ‘10.254.160.22/jpetstore/pet’ 部署在tomcat容器中。
class Pet {
public doPost(Request req, Response resp) {
// 业务代码
......
// 返回业务结论
out.write(new Pet(...));
}
}
我不希望在业务中间来加校验, 所以希望ngx.exec结束, 能捕获response, 然后对response内容加md5, 再返回客户端。
图例:
clients ---> nginx 校验 --> exec --> other_engine_apis
<--- 为返回值校验 <-- <--
所以, exec后面没办法加校验码, 或者说我不知道怎么去加这个效验码。
在 2016年4月22日星期五 UTC+8上午9:03:46,Guanglin Lv写道:
Kwanhur Huang 的示例已经很清晰了,完全可以在响应返回给用户之前,在header和body阶段进行你所谓的修改;
这个响应无论是nginx自己产生还是来自upstream。不太理解你说的不能是是哪里有壁障。
最好给出最小示例和需求,帮你分析; |
在 2016年4月21日星期四 UTC+8下午6:47:30,
cncha...@gmail.com写道:
谢谢,首先有很多的api, 而且api会是内网的各种实现, 可能是php, java实现。nginx 在反向代理的时候
做验证和返回的时候加上验证信息。
这样api就不用处理验证和封装验证返回。
所以,我并不能在exec中处理返回值。因为api并不是通过nginx实现的。
在 2016年4月21日星期四 UTC+8下午5:47:54,Kwanhur Huang写道:hello,
可以在ngx.exec转发的API中进行response的修改
如下
location = /test {
rewrite_by_lua '
ngx.log(ngx.NOTICE,”rewrite")
ngx.exec("/api")
';
}
location = /api {
content_by_lua '
ngx.say("ok")
';
header_filter_by_lua '
ngx.log(ngx.NOTICE,"filter header ")
ngx.log(ngx.NOTICE,"filter body ")
需求:
通过ngx_lua, 实现校验request请求, 验证通过执行反向代理, 并且根据反向代理response,
添加校验和生成新的response返回客户端。
示例图:
客户端s --- nginx --- apis
问题:
目前采用的ngx_lua, 验证客户端请求, 并根据请求参数ngx.exec()转发到不同的api。但是,
ngx.exec()直接采用api的response返回到客户端。我需要修改根据api的response加上校验生成
新的response返回到客户端。但是ngx.exec()并没有相关的方法。请问要怎样实现, 是否
ngx.exec()的原理并不能这样做。
--