HTTP 范围 header

标签 http header http-headers http-range

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

例如,假设一个文件的长度为 100 个字节,而我拥有所有 100 个字节。但是,我不知道预期的文件大小应该是多少,所以我请求文件并指定一个 Range header ,如下所示:

Range: bytes=100-

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

最佳答案

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

除了寻找 Accept-Ranges 响应之外,客户端通常会测试服务器是否处理范围请求。 Chrome 总是 发送 Range: bytes=0- 以及它对视频的第一个 GET 请求,所以这是你不能拒绝的。

每当客户端在其请求中包含 Range: 时,即使格式不正确,它也会期待部分内容 (206) 响应。当您在 HTML5 视频播放过程中向前寻找时,浏览器只请求起点。例如:

Range: bytes=3744-

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

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

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

要求:

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

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

要求:

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/*

提示:

您必须始终以范围内包含的内容长度进行响应。如果范围是完整的,从开始到结束,那么内容长度就是简单的区别:

要求: 范围:bytes=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 

这必须是一个 float 。与 Content-Length 不同,此值不必准确。它用于帮助播放器在视频中四处寻找。如果您正在流式传输网络广播并且只知道它会持续多长时间,那么最好包括您的估计持续时间而不是完全忽略它。因此,对于两个小时的网络广播,您可以包括以下内容:

X-Content-Duration: 7200.00 

对于某些媒体类型,例如 webm,您还必须包括内容类型,例如:

Content-Type: video/webm 

所有这些都是媒体正常播放所必需的,尤其是在 HTML5 中。如果您不提供持续时间,播放器可能会尝试根据其文件大小计算出持续时间(以允许搜索),但这并不准确。这很好,而且对于网络广播或实时流媒体来说是必需的,但对于视频文件的播放来说并不理想。您可以使用 FFMPEG 等软件提取持续时间并将其保存在数据库中,甚至保存在文件名中。

X-Content-Duration 正在逐步淘汰,取而代之的是 Content-Duration,因此我也将其包括在内。对“0-”请求的基本响应至少包括以下内容:

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 总是从以下开始它的第一个视频请求:

Range: bytes=0-

一些服务器会发送一个常规的 200 响应作为回复,它接受(但播放选项有限),但尝试发送一个 206 而不是显示您的服务器处理范围。 RFC 2616 说忽略范围 header 是可以接受的。

关于HTTP 范围 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303029/

相关文章:

python - 无法使用 python 从 URL 下载文件

header - 如何使用 PHP 邮件隐藏 X-PHP-Script header ?

node.js - Express js 将 header 编码为 utf-8

ruby-on-rails - 如何将身份验证 token 添加到每个 http RSpec 测试 header

php - 重定向回提交表单的页面时,如何在PHP中标记缺少的字段?

c# - HttpClient中 "The server returned an invalid or unrecognized response"的含义

rest - 如何使用 cURL 发出 PUT 请求?

ruby-on-rails - 在 Rails 中向请求添加 header

c++ - 对常量数组的 undefined reference

java - 在 JMeter 中匹配并记住 HTTP header 的值