V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
s609926202
V2EX  ›  NGINX

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

  •  
  •   s609926202 ·
    shangdev · 2017-10-26 14:28:00 +08:00 · 7093 次点击
    这是一个创建于 2618 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    各位有什么招,,,

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

    20 条回复    2019-01-11 20:22:54 +08:00
    rrfeng
        1
    rrfeng  
       2017-10-26 14:33:56 +08:00
    sub_filter 就是个文本替换,没什么不可以的。只要你能定位到字符串的位置,通常来说只能用正则。
    s609926202
        2
    s609926202  
    OP
       2017-10-26 14:41:34 +08:00
    @rrfeng 你的意思是使用 sub_filter 和正则结合实现替换的目的?
    tomczhen
        3
    tomczhen  
       2017-10-26 14:53:00 +08:00 via Android
    直接上 openresty
    s609926202
        4
    s609926202  
    OP
       2017-10-26 15:39:53 +08:00
    @tomczhen 这个可以实现吗?
    defunct9
        5
    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
        6
    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
        7
    s609926202  
    OP
       2017-10-26 17:45:56 +08:00
    @defunct9 subs_filter 可以实现吗?感觉和 sub_filter 没啥区别啊,,
    defunct9
        8
    defunct9  
       2017-10-26 17:53:08 +08:00
    @s609926202 gi 表示全局替换。这够你用了吧
    s609926202
        9
    s609926202  
    OP
       2017-10-26 17:57:03 +08:00
    @defunct9 我试着安装一下这个第三方模块测试一下吧,,
    s609926202
        10
    s609926202  
    OP
       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
        11
    ryd994  
       2017-10-26 20:49:07 +08:00
    safeoy
        12
    safeoy  
       2017-10-26 21:30:19 +08:00
    推荐一波 openresty
    s609926202
        13
    s609926202  
    OP
       2017-10-26 22:49:43 +08:00
    @safeoy
    @tomczhen
    求解 openresty 怎么实现我这个需求。
    ToughGuy
        14
    ToughGuy  
       2017-10-27 03:38:01 +08:00   ❤️ 1
    #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
        15
    ToughGuy  
       2017-10-27 03:39:17 +08:00
    另外你试试直接放到 server 下, 我放 location 下无效, 急着解决问题没有进一步查找原因。
    s609926202
        16
    s609926202  
    OP
       2017-10-27 09:49:36 +08:00
    @ToughGuy
    sub_filter 不行的,我写成这样:
    sub_filter_types *;

    然后查看效果是无效的。
    s609926202
        17
    s609926202  
    OP
       2017-10-27 09:52:13 +08:00
    @ToughGuy
    你确定替换成功的是 POST 请求返回的 json 串里的内容吗?
    defunct9
        18
    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
        19
    ToughGuy  
       2017-10-27 14:24:13 +08:00
    @s609926202

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

    最简单的方法你弄一个简单的返回内容来测试一下, 先从最简单的替换开始测试, 确保不是你替换规则写的有问题。
    ge2009
        20
    ge2009  
       2019-01-11 20:22:54 +08:00
    @s609926202 sub_filter_types *; 这个是可以的,亲测有效。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3154 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:39 · PVG 08:39 · LAX 16:39 · JFK 19:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.