设置proxy-request-buffering off后丢失Content-Length头是否正常?能否恢复?
问题解答
这是预期行为吗?
是,这属于Nginx的正常行为。
当开启proxy-request-buffering时,Nginx会先完整缓存客户端的请求体,确认整个请求接收完成后再转发给后端服务——此时它能明确知晓请求体的总长度,因此会将客户端发送的Content-Length头原样传递给后端。
而关闭proxy-request-buffering: off后,Nginx会采用流式转发模式:一边接收客户端的请求体,一边实时转发给后端。这种情况下,Nginx在转发请求时还无法获取完整的请求体长度,所以不会传递Content-Length头,转而使用Transfer-Encoding: chunked标识分块传输的请求体。
能否获取原始的Content-Length头?
可以,通过自定义请求头的方式让Nginx把客户端发送的原始Content-Length值传递给后端。
你可以在Ingress资源中添加额外注解,插入Nginx配置片段,将原始的Content-Length值存入自定义请求头:
nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header X-Original-Content-Length $http_content_length;
之后后端服务就可以从X-Original-Content-Length这个自定义头中拿到客户端最初发送的Content-Length值了。
内容的提问来源于stack exchange,提问作者Nawa
相关产品推荐
相关产品推荐

