HTTP范围标题

我正在阅读http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35并试图找出如何继续文件下载。

例如,假设一个文件的长度是100个字节,而且我有100个字节。 但是,我不知道预期的文件大小应该是什么,所以我要求该文件并指定一个Range标头,如下所示:

Range: bytes=100- 

这是一个有效的范围请求?

这是一个语法上有效的请求,但不是可满足的请求。 如果你仔细看看那部分,你会看到:

如果语法上有效的字节范围集包括至less一个字节范围规范,其第一字节pos小于实体主体的当前长度,或者至less包含一个后缀字节范围规范 – 零后缀长度,则字节范围集合是可满足的。 否则,字节范围集是不可满足的。 如果字节范围集合不可满足,服务器应该返回状态为416的响应(请求的范围不可满足) 。 否则,服务器应该返回一个包含entity-body可满足范围的状态206(Partial Content)的响应。

所以我想在你的例子中,服务器应该返回一个416,因为它不是该文件的有效字节范围。

正如Wrikken所说,这是一个有效的要求。 客户端请求媒体或恢复下载时也很常见。

客户端通常会testing以查看服务器是否处理远程请求,而不仅仅是寻找Accept-Ranges响应。 Chrome浏览器总是发送一个Range: bytes=0-与video的第一个GET请求,所以这是你不能忽视的东西。

每当客户端在其请求中包含Range: ,即使其格式不正确,也期待部分内容(206)响应。 当您在HTML5video播放期间寻求前进时,浏览器仅请求开始点。 例如:

 Range: bytes=3744- 

因此,为了让客户正确播放video,您的服务器必须能够处理这些不完整的范围请求。

您可以通过两种方式处理您在问题中指定的“范围”types:

首先,您可以回复给出的响应中所要求的起始点,然后文件的总长度减1(请求的字节范围为零索引)。 例如:

请求:

 GET /BigBuckBunny_320x180.mp4 Range: bytes=100- 

响应:

 206 Partial Content Content-Type: video/mp4 Content-Length: 64656927 Accept-Ranges: bytes Content-Range: bytes 100-64656926/64656927 

其次,您可以回答请求中给出的起点和开放式文件长度(大小)。 这是networking广播或其他媒体,总长度是未知的。 例如:

请求:

 GET /BigBuckBunny_320x180.mp4 Range: bytes=100- 

响应:

 206 Partial Content Content-Type: video/mp4 Content-Length: 64656927 Accept-Ranges: bytes Content-Range: bytes 100-64656926/* 

提示:

您必须始终以范围内包含的内容长度进行响应。 如果范围是完整的,从头到尾,那么内容长度就是差异:

请求:范围:字节= 500-1000

响应:内容范围:字节500-1000 / 123456

请记住,范围是零索引,所以Range: bytes=0-999实际上是请求1000字节,而不是999,所以回应如下:

 Content-Length: 1000 Content-Range: bytes 0-999/123456 

要么:

 Content-Length: 1000 Content-Range: bytes 0-999/* 

但是,如果可能的话,避免使用后一种方法,因为一些媒体播放器试图从文件大小中计算出持续时间。 如果您的要求是媒体内容,这是我的预感,那么您应该在响应中包含其持续时间。 这是用下面的格式完成的:

 X-Content-Duration: 63.23 

这必须是一个浮点数。 与Content-Length不同Content-Length ,这个值不一定是准确的。 它被用来帮助玩家在video周围寻找。 如果您正在播放networking直播,只能对其播放时间有一个大概的了解,那么最好包括您的预计播放时间,而不是完全忽略它。 因此,对于两个小时的networking广播,您可以包含如下内容:

 X-Content-Duration: 7200.00 

对于某些媒体types(如webm),还必须包含内容types,例如:

 Content-Type: video/webm 

所有这些都是媒体正常播放所必需的,特别是在HTML5中。 如果你没有给出持续时间,玩家可能会尝试从其文件大小中找出持续时间(以便寻找),但这样做并不准确。 这很好,对于networking直播或直播是必要的,但对于video文件的回放并不理想。 您可以使用FFMPEG等软件提取持续时间,并将其保存在数据库中,甚至是文件名。

X-Content-Duration正在被逐渐淘汰,以支持Content-Duration ,所以我也包括这一点。 对“0-”请求的基本回应至less包括以下内容:

 HTTP/1.1 206 Partial Content Date: Sun, 08 May 2013 06:37:54 GMT Server: Apache/2.0.52 (Red Hat) Accept-Ranges: bytes Content-Length: 3980 Content-Range: bytes 0-3979/3980 Content-Type: video/webm X-Content-Duration: 2054.53 Content-Duration: 2054.53 

还有一点:Chrome始终以下列方式开始第一个video请求:

 Range: bytes=0- 

有些服务器会发送一个200回答作为答复,它接受(但有限的回放选项),但是尝试发送一个206而不是你的服务器处理范围。 RFC 2616表示忽略范围标头是可以接受的。

与马克·诺瓦科夫斯基(Mark Novakowski)的答案相反,由于某种原因,这个答案已经被许多人赞成,是的,这是一个有效和可满足的要求。

事实上,正如Wrikken指出的那样,标准就是这样一个例子。 实际上,Firefox对这样的请求做出了响应(使用了206个代码),这正是我用来实现渐进式下载的方法,也就是只能得到一个实时增长的日志文件的尾部。