我使用 Nginx + lua 模块和body_filter_by_lua
指令。
Nginx-lua 文档说
当 Lua 代码可能会更改响应正文的长度时,则需要始终清除标头过滤器中的 Content-Length 响应标头(如果有)以强制流式输出。
ngx.header.content_length = nil
- 它会破坏keepalive连接吗?
- 它会破坏有问题的渠道的请求吗?
- 客户端如何知道数据已完全从服务器读取?
- 为什么 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
!