nginx代理post/put请求时错误清除content-length导致后端无法解析请求体,常见于proxy_pass_request_body off或手动置空该头;应删除相关误配,保留默认自动设置,或透传$context_length,避免干扰body处理逻辑。

这个问题本质是 Nginx 在代理 POST/PUT 等带 body 的请求时,错误地清除了或未正确传递 Content-Length 请求头,导致后端无法判断请求体长度,进而拒绝解析或阻塞等待——尤其在禁用请求体转发(proxy_pass_request_body off)时极易发生。
确认是否真被清空了 Content-Length
先抓包或查看 Nginx 访问日志(启用 $request_length 或 $body_bytes_sent),对比客户端原始请求与发往后端的请求头。常见误配是:
— 使用 proxy_set_header Content-Length "" 主动置空
— 同时设了 proxy_pass_request_body off 但没处理好 header 传递逻辑
— 或启用了 rewrite ... last 触发子请求,导致原始 body 和 length 丢失
保留原始 Content-Length 的正确写法
不要手动清空或覆盖该头。Nginx 默认会自动计算并设置它(只要 body 被转发)。若需禁用 body 转发但保留长度信息(极少见),应明确透传原始值:
proxy_pass_request_body off;-
proxy_set_header Content-Length $content_length;(注意是$content_length,不是$sent_http_content_length) - 确保没其他指令干扰,如
proxy_set_header Content-Length ""必须删除
更稳妥的做法:不关闭 body 转发
除非有强安全或审计要求,否则建议让 Nginx 正常转发 body:
- 删掉
proxy_pass_request_body off - 删掉所有对
Content-Length的显式设置(包括置空) - 保持
proxy_http_version 1.1(HTTP/1.1 支持 chunked,兼容性更好) - 如后端只认
Content-Length,Nginx 会自动将其添加(当 body 非 chunked 时)
检查后端是否依赖 Transfer-Encoding
某些后端(如部分 Java 框架)在收到 Transfer-Encoding: chunked 时可能忽略 Content-Length。若客户端发的是分块编码:
- 确保 Nginx 不强制转成
Content-Length:默认已开启chunked_transfer_encoding on;(1.3.9+) - 避免在配置中加
proxy_force_ranges on;或类似影响 body 处理的指令 - 验证后端能否正确处理 chunked 请求——可临时用 curl 测试直连后端











