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开始,支持断点续传。那要怎么判定在哪里断开,并且从哪里开始继续传,就要用到RangeContent-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状态码
image

  2、在客户机正常请求,带正常范围的请求头,返回 206 状态码
image

  3、在客户机正常请求,带超出文件大小范围的请求头,返回 416 状态码
image


参考文档
[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416

此处评论已关闭