无法通过$http_content_length读取Content-Length请求头的问题
Nginx传递Content-Length请求头到后端的问题解决
你遇到的问题源于Nginx$http_content_length变量的特殊行为:当请求采用分块编码(Transfer-Encoding: chunked),或者Nginx默认开启的请求体缓冲(proxy_request_buffering on)生效时,这个变量会被清空,导致你配置的X-Content-Length-2头无法被后端接收;而$http_content_type不存在这类场景限制,因此能正常传递。
解决方法有两种:
- 改用
$content_length变量:该变量直接对应请求的Content-Length值,无论Nginx是否处理请求体,只要客户端发送了这个头就能正确获取。修改后的配置如下:proxy_set_header X-Content-Length-2 $content_length; - 若必须保留
$http_content_length的逻辑,可关闭请求体缓冲(不推荐,可能影响服务性能):proxy_request_buffering off; proxy_set_header X-Content-Length-2 $http_content_length;
需要注意:如果客户端未发送Content-Length头(比如分块传输的请求),无论使用哪个变量,X-Content-Length-2头都不会被生成,这符合HTTP规范。
内容的提问来源于stack exchange,提问作者Nawa
相关产品推荐
相关产品推荐

