两次访问同一静态URL得到的文件长度不一样

现象

在使用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摆了一道。


### HTTP POST 请求与 GET 请求的区别、使用场景及特点 #### 1. 定义与基本功能 GET 和 POST 是 HTTP 协议中最常用的两种请求方法。GET 主要用于从服务器获取数据,而 POST 则侧重于向服务器提交数据并可能引发状态变化[^1]。 #### 2. 数据传递方式 - **GET 请求**:参数通过 URL 进行传递,这意味着所有的请求数据都会显示在地址栏中。这种方式适合简单的查询操作,比如检索公开的信息[^2]。 - **POST 请求**:数据被封装在请求体中发送给服务器,因此会暴露在 URL 中。这种设计使得 POST 更加适合处理敏感信息或量数据的传输[^3]。 #### 3. 幂等性 - **GET 请求**:是幂等的,意味着无论执行多少次相同的操作,其效果都是一样的,并且会修改服务器上的资源。 - **POST 请求**:是幂等的,每次调用可能会导致同的结果,例如创建新记录或其他状态变更的行为[^4]。 #### 4. 缓存行为 - **GET 请求**:可以被浏览器缓存下来,再次访问同一链接时可以直接返回之前的结果而必重新联系服务器。 - **POST 请求**:一般情况下会被自动缓存,因为它的主要目的是更新或者添加新的内容到数据库里去。 #### 5. 数据长度限制 - **GET 请求**:由于受制于 URL 长度的约束(具体取决于浏览器和 Web 应用程序),能携带的数据量有限。 - **POST 请求**:理论上没有严格的小上限,实际受限于服务器配置以及网络条件等因素决定的最允许值。 #### 6. 安全特性 - **GET 请求**:因所有参数都在URL可见,容易受到嗅探攻击;另外如果涉及密码之类的私密字段,则更加危险。 - **POST 请求**:相对更安全一些,因为它把数据放在 body 内部而是显式的展示出来,但这并等于绝对的安全,在未加密的情况下仍然可能存在风险。 #### 7. 浏览器历史记录 - 当用户点击回退按钮回到由 GET 方法产生的页面上时,他们只会看到原始的内容没有任何额外提示。 - 对于那些利用 POST 提交表单之后跳转至另一个界面的情况而言,当尝试退回前一页的时候往往会收到警告消息询问是否愿意重发这些已有的资料。 #### 示例代码对比两者实现形式: 对于一个简单的 HTML 表单来说, ```html <!-- 使用 GET --> <form action="/example" method="get"> <input type="text" name="query"/> <button>Search</button> </form> <!-- 使用 POST --> <form action="/submit" method="post"> <textarea name="content"></textarea> <button>Submit</button> </form> ``` 以上展示了如何分别采用 GET 或者 POST 来构建表单提交过程中的同做法。 ### 结论总结 综上所述,尽管二者同属 HTTP 的核心组成部分之一,但在具体的运用当中却各有千秋——GET 偏好简单快速地抓取静态网页片段或是少量无害变量组合而成的服务端响应;相比之下,POST 则更适合承担起诸如注册登录验证之类较为复杂甚至涉及到个人隐私保护的任务之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值