Nginx Openresty - 读取响应正文后更改 http 状态
Nginx Openresty - Change http status after reading the response body
我有一个 openresty nginx 来代理 elasticsearch。因此 grafana 客户端联系 nginx 并且 return 中的 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 中不受支持,是否有任何其他代理服务器可以完成这项工作?
如有任何帮助,我们将不胜感激。
您无法在 body_filter_by_lua_block
内更改状态,因为此时所有响应 headers 已发送到下游。
如果您确实需要它 - 不要使用 proxy_pass
。
而是使用 content_by_lua_block
并在其中使用 lua-resty-http 发出请求,阅读完整内容 body,分析它并使用您想要的任何状态代码进行响应。
这种方法是全缓冲的,可能对大响应有显着的性能影响。
您还应该记住 body 可能会被压缩。
我有一个 openresty nginx 来代理 elasticsearch。因此 grafana 客户端联系 nginx 并且 return 中的 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 中不受支持,是否有任何其他代理服务器可以完成这项工作?
如有任何帮助,我们将不胜感激。
您无法在 body_filter_by_lua_block
内更改状态,因为此时所有响应 headers 已发送到下游。
如果您确实需要它 - 不要使用 proxy_pass
。
而是使用 content_by_lua_block
并在其中使用 lua-resty-http 发出请求,阅读完整内容 body,分析它并使用您想要的任何状态代码进行响应。
这种方法是全缓冲的,可能对大响应有显着的性能影响。
您还应该记住 body 可能会被压缩。