Content-Range和Range头之间的区别是什么?

83

Content-RangeRange这两种HTTP头有什么区别?在什么情况下应该使用它们?

我正在尝试从特定字节偏移量流式传输音频文件。我应该使用哪个头部,Content-Range还是Range

2个回答

139

实际上,被接受的答案并不完整。Content-Range 不仅用于响应中,也可以在请求中使用,其提供了一个实体主体。

例如,HTTP 的 PUT 请求提供了一个实体主体,可能只提供了部分实体内容。因此,PUT 请求可以包括 Content-Range 头,指示服务器将部分实体主体合并到实体中的位置。

例如,让我们首先创建文件,然后使用 HTTP 进行追加操作:

请求 1:

PUT /file HTTP/1.1
Host: server
Content-Length: 1

a

请求2:

PUT /file HTTP/1.1
Host: server
Content-Range: bytes 1-2/*
Content-Length: 1

a

好的,让我们来看一下文件的内容...

请求 3:

GET /file HTTP/1.1
Host: server

HTTP/1.1 200 OK
Content-Length: 2

aa

这允许通过HTTP进行随机文件访问,包括读取和写入。我只是想澄清一下,因为我正在研究WebDAV客户端中使用Content-Range的情况,所以也许这些扩展信息对其他人有用。


9
Content-Range 在请求中是非法的。 - Mark Nottingham
17
那条评论是不正确的。RFC2616(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16)并没有将 Content-Range 标头限制为请求,而是将其绑定到“部分实体正文”。实际上,通常使用该功能来方便上传恢复或分块上传。 - Hank
5
我认为Content-Range可以在请求中使用。请参阅PUT方法部分:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6 - 实体的接收者不得忽略任何它不理解或实现的Content-*头(例如Content-Range),并且必须在这种情况下返回501(未实现)响应。- 请求可能包含Content-Range头,服务器应该考虑它。 - nietaki
2
@nietaki 当然可以,但这并不意味着它能像回答者描述的那样正常工作 - 我的意思是,它保证会出现501错误。 - Aaron Miller
7
查看 https://tools.ietf.org/html/rfc7231 而不是第4.3.4节中的草案版本后,我发现 "允许在给定目标资源上执行PUT方法的源服务器必须向包含Content-Range头字段的PUT请求发送400(错误请求)响应(...)"。毫无疑问,RFC的作者也只是人,他们也会犯错,而且RFC也在痛苦中演变,但显然Content-Range标头不是用于请求的,也没有太多意义。 - Hermes
显示剩余9条评论

89

Range在请求中使用,用于请求特定范围(或多个范围)的字节。 Content-Range在响应中使用,指示服务器正在提供哪些字节(可能与您请求的范围不同),以及整个内容的长度(如果已知)。


2
@BrunoMartinez 虽然您可以在请求中使用Content-Range,但从问题中很明显可以看出OP是在问如何下载特定范围的内容。我的回答是基于OP提出的问题,而不是试图给出Content-Range可用于每种情况的全面描述。 - Brian Campbell
3
@BrianCampbell,你当然是正确的。我只是想为了后人记录我的发现。我编辑了我的回答,以确保它不会给人留下你的答案任何错误的印象。 - btimby
3
没问题!谢谢你提供更详细的解释;如果你是通过谷歌搜索找到该页面,那就非常有用。 - Brian Campbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接