请求正文中的NGINX Lua搜索/替换

请求正文中的NGINX Lua搜索/替换,nginx,lua,Nginx,Lua,由于一些遗留软件,我需要更改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"> <SO

由于一些遗留软件,我需要更改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>
身体似乎总是零。我正在使用soapui来放置SOAP请求。我做错了什么?

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

if body
之后缺少一个
then
,您想使用
ngx.re.gsub
(我真的不知道为什么)。在这两次改变之后,我让它在我的实验室工作:

ngx.req.read_body()
本地body=ngx.req.get_body_data()
如果身体那么
body=ngx.re.gsub(body,“SOAP-ENV”、“SOAP”)
结束
ngx.req.set\U body\U数据(body)

lua\u need\u request\u body上的
lua\u成功了。请参见官方。

为什么要使用
access\u by\u lua
?这是请求处理的访问阶段,也称为。它决定是否允许客户端发出该请求。你想要的是
body\u filter\u by\u lua
(参见)事实上,不要介意最后的评论;openresty似乎已经在访问阶段提供了正文。谢谢,但不幸的是sub_筛选器替换了响应,在这种情况下,我想替换请求正文。谢谢,不幸的是,这不是问题所在。我已经在没有if语句的情况下尝试过了。据我所知,SOAP调用只是在请求体中使用POST发送的XML,但在使用
ngx.req.get\u body\u data()
时,它不知何故没有返回。可能请求的体大小超过了nginx能够存储在内存中的量(
client\u body\u buffer\u size
)。看见还有一些关于如何解决这个问题的提示。。。PS:这段代码肯定是和一个小帖子正文一起工作的……我在开篇文章中忘了提到这一点,但我已经找到了,并尝试添加“client\u body\u buffer\u size 50M;”(这比实际请求大得多),因此这似乎也不起作用。我们现在确实找到了解决办法(完全在nginx之外)。所以我们现在很好。再次感谢你的帮助!
<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>
        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;
        }