Nginx 删除分块内容的 Content-Length 标头

Jul*_*ien 11 nginx

我使用 nginx 1.2.3 代理脚本:

proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8880;
proxy_buffering off;
proxy_read_timeout 300s;
gzip off;
Run Code Online (Sandbox Code Playgroud)

脚本同时发送Transfer-encoding: chunkedContent-Length: 251

HTTP/1.0 307 Temporary Redirect
Content-length: 251
Pragma: no-cache
Location: /...
Cache-control: no-cache
Transfer-encoding: chunked
Run Code Online (Sandbox Code Playgroud)

我需要两者,但 nginx 会自动删除Content-Length

HTTP/1.1 302 Found
Server: nginx/1.2.3
Content-Type: application/json; charset=utf-8
Content-Length: 58
Connection: keep-alive
Location: /...
Run Code Online (Sandbox Code Playgroud)

因此,客户端不会等待发送块。这曾经适用于早期版本的 nginx。

Luk*_*kas 12

不幸的是,我无法对 cnst 的帖子发表评论 - 所以我将在这里回答。

nginx_http_proxy模块默认与 HTTP/1.0 中的上游对话。这可以通过指令更改proxy_http_version 1.1

这也可能是您的脚本返回 HTTP/1.0 答案的原因,尽管307此版本中不存在分块编码和状态代码。

您也不应该使用带重定向的分块编码,因为这实际上没有意义。

此外,似乎 nginx并没有将来自上游的一一传递给客户端,而是缓冲上游的响应。该Content-Length头字段被忽略,因为它是对的定义。我不得不查看模块的源代码,因为所有这些似乎都没有记录。

您可能想尝试nginx_tcp_proxy_module将分块内容代理为原始 TCP 数据:Github 上的模块


更新(10.04.14)
nginx_http_proxy模块支持X-Accel-* headers,其中一个 ( X-Accel-Buffering: yes|no) 控制是否应缓冲响应。

将此标头 ( X-Accel-Buffering: no)添加到后端的响应将导致 nginx 直接将块传递给客户端。

此标头允许在每个请求的基础上控制缓冲。

该模块还有一个配置指令 proxy_buffering来启用或禁用响应缓冲(不缓冲意味着发送块将起作用)。

此处记录代理缓冲(基于标头和指令)。


Jo *_*iss 10

至于卢卡斯alludet于HTTP 1.1禁止Content-Length,如果有一个Transfer-Encoding组。

引用http://www.ietf.org/rfc/rfc2616.txt

   3.If a Content-Length header field (section 14.13) is present, its
     decimal value in OCTETs represents both the entity-length and the
     transfer-length. The Content-Length header field MUST NOT be sent
     if these two lengths are different (i.e., if a Transfer-Encoding
     header field is present). If a message is received with both a
     Transfer-Encoding header field and a Content-Length header field,
     the latter MUST be ignored.
Run Code Online (Sandbox Code Playgroud)

  • 此外,Nginx 符合 HTTP 1.1 的正确行为对于防止 [HTTP 请求走私](https://en.wikipedia.org/wiki/HTTP_request_smuggling) 攻击大有帮助。 (2认同)