【问题标题】:Nginx Openresty - Change http status after reading the response bodyNginx Openresty - 读取响应正文后更改 http 状态
【发布时间】:2018-04-18 11:48:51
【问题描述】:

我有一个 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
        }
      }
 }
}

上面的代码只是将响应体设为 nil 。但是有没有办法改变http状态?或者如果 nginx 不支持它,是否有任何其他代理服务器可以完成这项工作?

任何帮助将不胜感激。

【问题讨论】:

    标签: nginx proxy openresty


    【解决方案1】:

    您无法更改body_filter_by_lua_block 中的状态,因为此时所有响应标头都已发送到下游。

    如果你确实需要它 - 不要使用proxy_pass

    改为使用 content_by_lua_block 并在其中使用 lua-resty-http 发出请求、阅读全文、分析它并使用您想要的任何状态代码进行响应。

    这种方法是完全缓冲的,可能会对大响应产生重大的性能影响。

    另外你应该记住,身体可能会被压缩。

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2021-12-14
      • 2016-05-03
      • 1970-01-01
      • 2018-12-05
      • 2019-02-07
      相关资源
      最近更新 更多