gpt4 book ai didi

http - 如何在 Varnish 中禁用 'Transfer-Encoding: chunked' 编码?

转载 作者:可可西里 更新时间:2023-11-01 15:09:39 25 4
gpt4 key购买 nike

使用 Varnish 4 ,我有一组后端以有效的 Content-Length header 和无 Transfer-Encoding header 响应。

在客户端第一次点击时,Varnish 没有使用这些 header 响应客户端,而是删除了 Content-Length header 并添加了 Transfer-Encoding: chunked到响应。 (有趣的是,有效负载中似乎没有任何 block - 它是一个连续的有效负载)。

这会给尝试根据 Content-Length header 进行片段大小、带宽等分析的客户端(例如 Flash 视频播放器)带来严重问题。他们的分析失败了,他们不能做多比特率流媒体等事情。

我已经尝试了一些半显而易见的事情,比如:

  • beresp.do_stream = true
  • beresp.do_gzip = false
  • 取消设置 req.http.Accept-Encoding

示例后端响应:

HTTP/1.1 200 OK
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 19:44:35 GMT
Server: Apache
Content-Length: 796618
Connection: keep-alive

Varnish 响应示例:

HTTP/1.1 200 OK
Server: Apache
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 23:10:06 GMT
X-Varnish: 2
Age: 0
Transfer-Encoding: chunked
Accept-Ranges: bytes

对象的后续加载包括 Content-Length header ,而不是第一次加载到缓存中。

VCL:https://gist.github.com/onethumb/e64a405cc579909cace1

Varnish 日志输出:https://gist.github.com/onethumb/e66a2bc4727a3a5340b6

Varnish 追踪:https://www.varnish-cache.org/trac/ticket/1506

最佳答案

目前,do_stream = false 将执行您想要的操作。

在后端发送未分块的情况下避免分块编码是 Varnish future 可能的改进。

例子:

sub vcl_backend_response {
if(beresp.http.Content-Type ~ "video") {
set beresp.do_stream = false;
set beresp.do_gzip = false;
//set resp.http.Content-Length = beresp.http.Content-Length;
}
if(beresp.http.Edge-Control == "no-store") {
set beresp.uncacheable = true;
set beresp.ttl = 60s;
set beresp.http.Smug-Cacheable = "No";
return(deliver);
}
}

关于http - 如何在 Varnish 中禁用 'Transfer-Encoding: chunked' 编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23643233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com