![内容长度和传输编码分块 nginx、node-http-proxy](https://linux22.com/image/586399/%E5%86%85%E5%AE%B9%E9%95%BF%E5%BA%A6%E5%92%8C%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81%E5%88%86%E5%9D%97%20nginx%E3%80%81node-http-proxy.png)
我有以下设置 - node-http-proxy 充当反向代理,根据需要将所有请求转发到 nginx/socket.io
我的问题是当我从浏览器发送 HTTP DELETE 请求时,node-http-proxy 会添加一个标头“Transfer Encoding Chunked”,因为来自浏览器的请求没有内容长度。来自浏览器的请求没有内容长度,因为它没有正文。Nginx 不喜欢 Transfer Encoding Chunked 标头,并抛出 411 要求输入内容长度。
当我将虚拟数据作为 DELETE 请求的一部分发送时,问题就解决了,因此存在内容长度,并且 node-http-proxy 不会添加 Transfer Encoding Chunked 标头,并且 nginx 很高兴。
我想了解 node-http-proxy 是否没有按预期工作,因为当由于没有内容主体而缺少内容长度时,它会添加传输编码分块标头。
编辑-更多信息:
当我尝试删除 node-http-proxy 并直接将请求发送到 nginx 时,nginx 对此很满意。请注意,浏览器未设置 Content Length(因为正文为空)或 Transfer Encoding Chunked
答案1
来自 RFC 2616 - “请求中消息体的存在由请求的消息头中包含的 Content-Length 或 Transfer-Encoding 头字段表示。”所以我认为 nginx 期望 Content-Length 是正确的,因为它认为它有一个消息体。
您可以尝试明确将 Content-Length 设置为 0。
也可以尝试:http://wiki.nginx.org/HttpChunkinModule
答案2
我在设置中遇到了完全相同的问题。详细信息可在此处找到:http://development.blog.saw.sonyx.net/2012/11/http-delete-failing-with-411.html
我最终修补了 http-proxy,为 DELETE 请求添加了 content-length。你可以在我的 http-proxy 分支上找到补丁:
https://github.com/ian7/node-http-proxy/commit/642a838093286da3b3b84726e38dcf3f8748f7f0