Nginx Openresty - 读取响应体后更改 Http 状态码

我有一个 Openresty Nginx 用于代理 Elasticsearch。因此,Grafana 客户端联系 Nginx,Nginx 返回从 Elasticsearch 获取的响应。目标是,如果 Elasticsearch 的响应体包含关键字 "timedout": true,则将 Http 状态码更改为 504。

使用 body_by_filter_lua_block 读取响应体,但此指令不支持更改 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
        }
      }
 }
}

上述代码只是将响应体更改为 null 。但是否有一种方法可以更改 Http 状态码?或者,如果 nginx 不支持该功能,则是否有其他代理服务器可以完成此工作?

任何帮助都将不胜感激。

点赞
用户2060502
用户2060502
> 不能在 `body_filter_by_lua_block` 中更改状态,因为此时所有响应头已经发送到下游。

> 如果你确实需要,不要使用 `proxy_pass`。

> 取而代之,使用 `content_by_lua_block`,并在其中使用 [lua-resty-http](https://github.com/pintsized/lua-resty-http) 发出请求,读取完整的响应体,分析并响应任何需要的状态代码。

> 此方法是全缓冲的,并且可能对大响应具有重大的性能影响。

> 同时,您应该记住,响应体可能已经被压缩。
2018-04-19 12:57:54