【问题标题】:NGINX Lua search/replace in request bodyNGINX Lua 在请求正文中搜索/替换
【发布时间】:2020-01-11 22:44:56
【问题描述】:

由于某些遗留软件,我需要更改 SOAP 请求的正文。它使用 SOAP-ENV 作为命名空间,而它需要变成“soap”:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Body>

应该变成:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>

尽管它应该无关紧要,但对于旧版软件它确实如此。至少现在我要快速修复一下请求正文中的搜索/替换。 Nginx 在系统之前作为网络服务器运行,所以我搜索了一下,发现它只能由 Lua 完成。我已经安装了nginx-extras,现在正在使用以下脚本:

        location ~ '\.php$' {
             location ~ ^/webservice/ {
               access_by_lua_block
               {
                   ngx.req.read_body()
                   local body = ngx.req.get_body_data()
                   if body
                      body = string.gsub(body, "SOAP-ENV", "soap")
                   end
                   ngx.req.set_body_data(body)
               }
             }
             fastcgi_split_path_info ^(.+?\.php)(|/.*)$;

             include fastcgi_params;
             fastcgi_param HTTP_PROXY "";
             fastcgi_param SCRIPT_FILENAME 
             $document_root$fastcgi_script_name;
             fastcgi_param PATH_INFO $fastcgi_path_info;
             fastcgi_param QUERY_STRING $query_string;
             fastcgi_intercept_errors on;
             fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        }

似乎 body 总是为零。我正在使用 SOAP UI 来放置 SOAP 请求。我在这里做错了什么?

【问题讨论】:

  • 你为什么要使用access_by_lua?这是请求处理的访问阶段,也就是。它决定是否允许客户端发出该请求。你想要的是body_filter_by_lua(见readme
  • 其实,别管最后的评论了;毕竟,openresty 似乎已经在访问阶段提供了 body。

标签: nginx lua


【解决方案1】:

[自我提醒:午餐时不要再快速阅读]

if body 后面缺少一个then,而您想使用ngx.re.gsub(我真的不知道为什么)。经过这 2 项更改后,我的实验室开始使用它:

                   ngx.req.read_body()
                   local body = ngx.req.get_body_data()
                   if body then
                      body = ngx.re.gsub(body, "SOAP-ENV", "soap")
                   end
                   ngx.req.set_body_data(body)

【讨论】:

  • 谢谢,但不幸的是 sub_filter 替换了响应,在这种情况下我想替换请求正文。
  • 谢谢,很遗憾,这不是问题所在。我已经尝试过不使用 if 语句。据我所知,SOAP 调用只是在请求正文中使用 POST 发送 XML,但不知何故,在使用 ngx.req.get_body_data() 时它不会返回。
  • 也许请求的主体大小超过了 nginx 能够存储在内存中的数量 (client_body_buffer_size)。见ngx.req.get_body_data Doc。还有一些关于如何解决这个问题的提示...... PS:代码肯定适用于一个小的帖子体......
  • 我忘了在我的开篇文章中提到这一点,但我已经找到并尝试添加`client_body_buffer_size 50M;`(比实际请求大得多),所以这似乎不起作用任何一个。我们现在确实找到了一种解决方法(完全在 nginx 之外)。所以我们现在很好。再次感谢您的帮助!
【解决方案2】:

lua_need_request_body on; 成功了。见官方documentation

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2014-05-12
    • 2021-05-03
    • 2022-01-24
    • 2017-11-13
    相关资源
    最近更新 更多