【问题标题】:Is the Range header the size in bytes of the compressed or uncompressed bytes?Range 标头是压缩字节还是未压缩字节的字节大小?
【发布时间】:2015-08-25 16:09:35
【问题描述】:
我正在 node.js 中实现静态文件服务以供学习和娱乐。假设我要发送一个名为 party-time.txt 的文件,即:
100 bytes uncompressed
70 bytes gzipped
如果用户请求Range: bytes=-10,此请求是针对最后 10 个未压缩字节(例如,91-100)还是最后 10 个压缩字节(例如,61-70)?
【问题讨论】:
标签:
javascript
node.js
http-headers
webserver
【解决方案1】:
使用有条件或无条件 GET 方法的 HTTP 检索请求可以请求实体的一个或多个子范围,而不是整个实体,使用 Range 请求标头,适用于作为结果返回的实体请求。
14.35.2 Range Retrieval Requests
因为从请求返回的实际实体是 gzip 编码的数据,所以该数据用于派生 Content-Length,因此 Range 应用于该数据。
【解决方案2】:
作为 HTTP 协议的一部分,您应该指定 Content-Encoding 和 Content-Length。内容长度应与相对于您的编码技术的文件长度相匹配。例如,如果您将 Content-Encoding 设置为 gzip,则用户请求的字节范围应该是对压缩长度的请求。
数据包示例:
HTTP/1.1 200 OK
Date: mon, 28 Aug 2015 22:38:34 GMT
Server: <Your server>
Last-Modified: mon, 28 Aug 2015 22:38:34 GMT
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip