Http content-length absence and keep-alive

我使用 Nginx + Lua 模块和 body_filter_by_lua 指令。

Nginx-lua 文档

当 Lua 代码可能改变响应体的长度时,则需要始终在头过滤器中清除 Content-Length 响应头(如果有任何)以强制实时输出。

ngx.header.content_length = nil
  1. 它能破坏 keep-alive 连接吗?
  2. 它能破坏在有问题的信道上的请求吗?
  3. 客户端如何知道数据已从服务器完全读取?
  4. 为什么 Nginx 不强制对这些响应使用 Transfer-Encoding: chunked

更新。

作为临时解决方案,我将响应转换为分块格式,方式如下

ngx.header['Content-Type'] = "text/html"
ngx.header['Content-Length'] = nil
ngx.header['Transfer-Encoding'] = 'chunked'

并在内容重写阶段中

-- 当前块的长度。
local hexlen = string.format("%x", #ngx.arg[1])
ngx.arg[1] = hexlen .. "\r\n" .. ngx.arg[1] .. "\r\n"

-- 最后的块。发送最终序列。
if (ngx.arg[2]) then
    ngx.arg[1] = ngx.arg[1] .. "0\r\n\r\n"
end

更新 2。

使用 ngx.location.capture

点赞