两次访问同一静态URL得到的文件长度不一样
2016-01-24 15:30
363 查看
现象
在使用chrome浏览器请求一个媒体服务器上的URL时,例如www.video-server.com/media/videos/mp4/1.mp4
chrome在播放时会进行先后两次请求,应答的Content-Length不一致,具体情况如下(对请求地址做了修改改):
第一个请求
GET http://www.video-server.com/media/videos/mp4/1.mp4 HTTP/1.1 Host: www.video-server.com Proxy-Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 HTTP/1.1 200 OK Content-Length: 9882602 Content-Type: video/mp4 Date: Sun, 24 Jan 2016 07:01:56 GMT Etag: "2479115360" Last-Modified: Fri, 16 Jan 2015 20:01:54 GMT Server: lighttpd/1.4.28 X-Mod-H264-Streaming: version=2.2.9
第二个请求
GET http://www.video-server.com/media/videos/mp4/1.mp4 HTTP/1.1 Host: www.video-server.com Proxy-Connection: keep-alive Accept-Encoding: identity;q=1, *;q=0 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 Accept: */* Referer: http://www.video-server.com/media/videos/mp4/1.mp4 Accept-Language: zh-CN,zh;q=0.8 Range: bytes=0- HTTP/1.1 206 Partial Content Accept-Ranges: bytes Content-Length: 9882560 Content-Range: bytes 0-9882559/9882560 Content-Type: video/mp4 Date: Sun, 24 Jan 2016 07:01:57 GMT Etag: "2483794507" Last-Modified: Fri, 16 Jan 2015 20:01:54 GMT Server: lighttpd/1.4.28
分析
仔细观察请求头部和应答头部,两次请求的User-Agent都一样,应答的Last-Modified都一样,区别只在于后一个请求使用了range方法,如下:第一次请求
直接请求
应答Content-Length=9882602
第二次请求
Range: bytes=0-
应答Content-Length=9882560,比第一次少了42个字节。
经过查询1,对于H264格式的媒体文件,lighttpd服务器上根据请求方法是否携带range,选择mod_staticfile或H264 module两个模块应答。
如果不带range,即第一次请求,lighttpd服务器通过H264 module提供H264 streaming服务,其应答头部的“X-Mod-H264-Streaming”就说明了这一点,该模块会修改媒体文件的头部,比如moov atom,导致文件尺寸发生变化。
如果请求方法带range,即第二次请求,lighttpd服务器认为这是对静态文件的部分请求,由mod_staticfile module提供返回数据,客户端得到的是服务器上的原始文件。
思考
一个URL指向两个或两个以上的文件并不稀奇,比如桌面和移动端的浏览器对同一URL的访问会返回不同的页面。但对于静态URL的访问,出现文中的情况就比较少见了,chrome浏览器本意是通过后续带有的range请求,提高视频的播放速度,没想到被lighttpd摆了一道。
相关文章推荐
- Ubuntu 64位adb无法使用问题的解决
- POJ2531-Network Saboteur-暴力枚举+记忆化/dfs/随机化乱搞
- android 基础知识点(面试准备)
- 【Redis笔记(四)】 Redis数据结构 - list链表
- SpringMVC接收json数据中的一些问题(415错误的解决)
- 构造,析构,覆盖,重载,隐藏
- A Primer on Open-Source NoSQL Databases
- 【源】从零自学Hadoop(10):Hadoop1.x与Hadoop2.x
- 【源】从零自学Hadoop(11):Hadoop命令上
- 【源】从零自学Hadoop(12):Hadoop命令中
- 【源】从零自学Hadoop(13):Hadoop命令下
- 【源】从零自学Hadoop(14):Hive介绍及安装
- 【源】从零自学Hadoop(15):Hive表操作
- 【源】从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上
- 【源】从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
- [置顶]【源】从零自学Hadoop系列索引
- servelt笔记一
- 贪心&Moving Tables
- Android seekBar2.环形进度条
- 我是怎么处理其他网站恶意爬虫博客园的,希望大家喜欢(第二弹)