Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx Openresty-读取响应正文后更改http状态_Nginx_Proxy_Openresty - Fatal编程技术网

Nginx Openresty-读取响应正文后更改http状态

Nginx Openresty-读取响应正文后更改http状态,nginx,proxy,openresty,Nginx,Proxy,Openresty,我有一个openresty nginx来代理elasticsearch。因此,grafana客户端联系nginx,nginx从elasticsearch获取响应。目标是,如果elasticsearch的响应主体包含键“timedout”:true,则将http状态更改为504 使用body\u by\u filter\u lua\u块读取响应正文,但此指令不支持更改http状态 http { lua_need_request_body on; server { listen 8000;

我有一个openresty nginx来代理elasticsearch。因此,grafana客户端联系nginx,nginx从elasticsearch获取响应。目标是,如果elasticsearch的响应主体包含键“timedout”:true,则将http状态更改为504

使用body\u by\u filter\u lua\u块读取响应正文,但此指令不支持更改http状态

http {
 lua_need_request_body on;
 server {
 listen 8000;
 location / {
    proxy_pass "http://localhost:9200"
    header_filter_by_lua_block {
        ngx.header.content_length = nil

         }
     body_filter_by_lua_block {
        if string.find(ngx.arg[1], "\"timedout\":true") then
          ngx.arg[1] = nil
        }
      }
 }
}
上面的代码只是使响应主体为nil。但是有没有办法改变http状态呢?或者,如果nginx不支持它,是否有其他代理服务器可以执行此任务


任何帮助都将不胜感激。

您不能通过\u lua\u块更改
正文\u过滤器\u中的状态,因为此时所有响应标头都已发送到下游

如果您确实需要,请不要使用
proxy\u pass

相反,使用
content\u by\u lua\u block
并在其中发出请求,阅读全文,分析内容,并使用所需的任何状态代码进行响应

这种方法是完全缓冲的,对于大型响应可能具有显著的性能影响

你也应该记住,身体可能会被压缩