2

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

Nginx-lua 文档

当 Lua 代码可能会更改响应正文的长度时,则需要始终清除标头过滤器中的 Content-Length 响应标头(如果有)以强制流式输出。

ngx.header.content_length = nil
  1. 它会破坏keepalive连接吗?
  2. 它会破坏有问题的渠道的请求吗?
  3. 客户端如何知道数据已完全从服务器读取?
  4. 为什么 Nginx 不强制Transfer-Encoding: chunked执行此响应?

更新。

作为临时解决方案,我将响应转换为分块通过

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

在内容重写阶段

-- Length of current chunk.
local hexlen = string.format("%x", #ngx.arg[1])
ngx.arg[1] = hexlen .. "\r\n" .. ngx.arg[1] .. "\r\n"

-- Last chunk. Send final sequence.
if (ngx.arg[2]) then
    ngx.arg[1] = ngx.arg[1] .. "0\r\n\r\n"
end

更新 2。

使用ngx.location.capture

4

0 回答 0