我使用 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: chunked和Content-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 上的模块
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)
| 归档时间: |
|
| 查看次数: |
39077 次 |
| 最近记录: |