HTTP 206状态 与 416错误(HTTP 断点续传)
背景
话说某天研发跑来问我,因为官网需要上线一个介绍视频,在测试环境都是正常播放,把代码推上去之后在生产环境不能播放,报416错误。
排查
1、排查nginx报错日志,并没有找到访问该MP4文件报错记录。在正常访问日志access.log
中,能看到416的记录。
2、仔细查看返回的头部,文件的大小content-length
不正确,且文件的类型content-type
也不正确,考虑到测试环境和生产环境都是配置相同的mime.types
文件。推断是代码中的视频文件有问题。
3、查看代码中的文件发现传上来的视频文件为空文件。
4、和研发沟通下,是他们在推送代码的时候,把文件拷贝错了
解决
让研发重新更新正确的视频文件并推送代码。
后记
继续搞清楚为什么空的MP4文件会返回错误的头部。我们先了解416这个状态码的解释: Requested range not satisfiable
翻译过来就是:客户端请求的范围无效。
查了资料,是因为从HTTP/1.1
开始,支持断点续传。那要怎么判定在哪里断开,并且从哪里开始继续传,就要用到Range
和Content-Range
这两个头部。
我把请求的流程简述一下:
1、客户端发送请求给web服务器,web服务器告诉客户端,文件总大小是多少(Content-Length: 8
)并且支持断点续传 (Accept-Ranges: bytes
)
2、客户端带上Range
请求头部,告诉web服务器客户端要从哪个位置开始传数据。
3、若这个断点的位置与Content-Range
的范围不符合,则会报 416 错误。若符合,传输完成后返回206。若请求头不带Range
传输完成之后返回 200 状态码。
验证一下:
在本地虚拟机开启web(之所以重新在虚拟机弄,是因为之前测试的域名太污了),并且生成一个非空文件 test.mp4 。客户机改hosts,去请求www.bcsama.top/test.mp4
1、在客户机正常请求,不带 Range 请求头,返回 200状态码
2、在客户机正常请求,带正常范围的请求头,返回 206 状态码
3、在客户机正常请求,带超出文件大小范围的请求头,返回 416 状态码
参考文档
[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416
最后更新于 2017-11-21 15:03:16 并被添加「」标签,已有 2933 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
此处评论已关闭