如何用 nginx 使用 sub_filter 模块替换 POST 返回的 json 字符串内容?

2017-10-26 14:28:00 +08:00
 s609926202

醉了,感觉 sub_filter 模块好像不能替换 POST url 返回的 json 字符串似的,,

各位有什么招,,,

并不是 proxy_set_header Accept-Encoding "";的问题。

7056 次点击
所在节点    NGINX
20 条回复
rrfeng
2017-10-26 14:33:56 +08:00
sub_filter 就是个文本替换,没什么不可以的。只要你能定位到字符串的位置,通常来说只能用正则。
s609926202
2017-10-26 14:41:34 +08:00
@rrfeng 你的意思是使用 sub_filter 和正则结合实现替换的目的?
tomczhen
2017-10-26 14:53:00 +08:00
直接上 openresty
s609926202
2017-10-26 15:39:53 +08:00
@tomczhen 这个可以实现吗?
defunct9
2017-10-26 15:47:26 +08:00
location / {
proxy_pass http://pop.abcd.com;
proxy_set_header Host pop.abcd.com;
proxy_set_header Accept-Encoding "";
subs_filter pop.abcd.com 112.6.226.18:9000 gi;
}
tomczhen
2017-10-26 17:00:07 +08:00
@s609926202 可以,gzip 也能解决。自己有个练手玩的项目,可以参考一下。

https://github.com/TomCzHen/simple-api-gateway/blob/master/openresty/lua/request_gateway.lua
s609926202
2017-10-26 17:45:56 +08:00
@defunct9 subs_filter 可以实现吗?感觉和 sub_filter 没啥区别啊,,
defunct9
2017-10-26 17:53:08 +08:00
@s609926202 gi 表示全局替换。这够你用了吧
s609926202
2017-10-26 17:57:03 +08:00
@defunct9 我试着安装一下这个第三方模块测试一下吧,,
s609926202
2017-10-26 20:14:06 +08:00
@defunct9
亲测无效,以下是我的配置:
subs_filter 's3.amazonaws.com/adwords.yesssbi.com' 'elasnode.trudsiu.com' gi;
subs_filter_types application/json;
ryd994
2017-10-26 20:49:07 +08:00
safeoy
2017-10-26 21:30:19 +08:00
推荐一波 openresty
s609926202
2017-10-26 22:49:43 +08:00
@safeoy
@tomczhen
求解 openresty 怎么实现我这个需求。
ToughGuy
2017-10-27 03:38:01 +08:00
#sub_filter_types *;
sub_filter_types 'application/json';
sub_filter 'abcd' 'dcba';
sub_filter_once off;


默认只替换 text/html 可以通过 sub_filter_types 指定类型, *代表所有类型。
就在 10 分钟之前才用这个功能临时解决 php 打印错误信息导致 json 非法的问题, 给程序填坑, 哈哈。
ToughGuy
2017-10-27 03:39:17 +08:00
另外你试试直接放到 server 下, 我放 location 下无效, 急着解决问题没有进一步查找原因。
s609926202
2017-10-27 09:49:36 +08:00
@ToughGuy
sub_filter 不行的,我写成这样:
sub_filter_types *;

然后查看效果是无效的。
s609926202
2017-10-27 09:52:13 +08:00
@ToughGuy
你确定替换成功的是 POST 请求返回的 json 串里的内容吗?
defunct9
2017-10-27 11:01:16 +08:00
@s609926202 http://101.207.249.253:8000/adwords.yesssbi.com
返回的是个 xml,我已经把 adwords.yessbi.com 换成 elasnode.trudsiu.com

你我不知道要提交什么 json,所以根据你情况自己修改就好。

location / {
proxy_pass http://s3.amazonaws.com;
proxy_set_header Host 101.207.249.253;
proxy_set_header Accept-Encoding "";
subs_filter_types application/xml text/html text/css text/xml;
subs_filter adwords.yesssbi.com elasnode.trudsiu.com gi;
}
ToughGuy
2017-10-27 14:24:13 +08:00
@s609926202

我替换的也是 POST 返回的字符串。

最简单的方法你弄一个简单的返回内容来测试一下, 先从最简单的替换开始测试, 确保不是你替换规则写的有问题。
ge2009
2019-01-11 20:22:54 +08:00
@s609926202 sub_filter_types *; 这个是可以的,亲测有效。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/400945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX