可以同时使用GZIP和字节范围发送HTTP响应吗?

可以同时使用GZIP和字节范围发送HTTP响应吗?,http,range,gzip,Http,Range,Gzip,请求: ... Content-Range: bytes 27482871-41601067/41601068 ... 我尝试从文件中读取字节,然后再读取到GZIP。响应如下所示: response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); ... Server: GlassFish Server Open Source Edition 4.1 X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFis

请求:

...
Content-Range: bytes 27482871-41601067/41601068
...
我尝试从文件中读取字节,然后再读取到GZIP。响应如下所示:

response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

...
Server: GlassFish Server Open Source Edition  4.1
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition  4.1  Java/Oracle Corporation/1.8)
Date: Thu, 26 Nov 2015 21:44:21 GMT
Accept-Ranges: bytes
Connection: keep-alive
Keep-Alive: timeout=1800
Content-Disposition: attachment;filename*=utf-8''Marq_Aurel_Rayman_Rave_-_Intdo_The_Blue_%28Max_R_remix%29.wav
ETag: Marq_Aurel_Rayman_Rave_-_Intdo_The_Blue_%28Max_R_remix%29.wav-41601068-1403655006000
Cache-Control: private,max-age=604800
Last-Modified: Wed, 25 Jun 2014 00:10:06 GMT
Content-Range: bytes 27482871-41601067/41601068
Content-Encoding: gzip
...

如果我暂停并继续下载,下载就会失败。也许我不应该在范围响应中使用GZIP?

是的。可以在一定范围内请求Gzip内容,但只能使用
传输编码
,而不能使用
内容编码

内容编码
如果您要求一个字节范围,则无法工作:它意味着服务器对整个文档进行编码,如果整个内容使用gzip编码,而您只要求一个字节范围,则您不知道如何解压。(您无法解压缩部分gzip,或者至少在没有启动的情况下无法解压缩。)

您可以使用
Transfer-Encoding
,而不是使用range来服务整个压缩文档的一大块。这将为您提供您想要的范围,并压缩该范围。好多了

当您使用
接受编码
头请求
内容编码
时,您使用
TE
头请求
传输编码

然而,这就是问题的症结所在:很少有web服务器支持它。例如,如果您从CloudFlare中提取内容,您会发现它们没有


这里是他们讨论这个问题的地方,这里是。

字节范围是原始未压缩负载还是压缩负载?我想一定是前者吧?我这么认为是因为据我所知,每个块都是单独压缩的。@Khoi是的,没错!您正在根据存储在服务器上的内容指定一个范围。这里没有
内容编码
!我后来发现,你不能在Chrome中发送
TE
头,也不能解析
传输编码:gzip,chunked
响应。感觉我们离在浏览器中看到它还有很多年了。