webserver - 该视频是否被缓存?
问题描述
我想确保浏览器正在缓存我提供的视频。
我已经打开了这个测试页面:https ://itype.online/videoCacheTest
我对为什么在视频的“网络”选项卡中没有看到 304 状态感到有些困惑。相反,我看到状态 206。
我的文件是从浏览器缓存中检索的,还是每次都来自服务器?
谢谢,彼得
解决方案
您共享的链接似乎已损坏(此时存在一些云可用性问题,所以这可能就是问题所在),但可以使用其他视频进行测试,并且会看到类似的行为。
最常见的流式传输视频方式值得一看:
- 单个视频文件的简单 HTTP 流式传输
- 通过 HLS 或 MPEG DASH 等专用流式传输协议进行流式传输
对于简单的 HTTP 流,通常使用字节范围请求下载视频文件。理论上,只要缓存可以处理范围请求,那么缓存应该可以缓存响应 - 来自 HTTP 缓存规范(RFC 2616 Fielding,等):
收到状态码为 200、203、206、300、301 或 410 的响应可以由缓存存储并用于响应后续请求,受到期机制的约束,除非缓存控制指令禁止缓存。但是,不支持 Range 和 Content-Range 标头的缓存不得缓存 206(部分内容)响应。
在实践中,许多浏览器似乎仍然没有缓存 206 响应,如您所见。有时,观察行为变得更加困难,因为某些浏览器为了加快下载速度,最初可能会添加对完整视频的第一个请求,然后在知道视频长度时取消并替换为范围请求。
HLS 和 DASH 引入了进一步的复杂性 - 使用 ABR,您可以在服务器上创建多个比特率版本的视频,每个版本都分成块。播放器根据许多因素决定从哪个分辨率下载下一个视频块,通常包括网络条件和设备显示大小和功能。
因此,当使用 HLS 或 DASH 时,重播视频不一定每次都下载相同的块,因为网络条件等可能已经改变。
您通常可以在浏览器检查器上看到特定项目是从网络上下载还是从内存/缓存加载 - 例如使用 Safari 网络检查器:
对于 Chrome:
如果您想 100% 确定,您也可以使用 Wireshark - 这将显示进出您的设备的网络流量:https ://www.unified-streaming.com/academy
推荐阅读
- ms-access - 如何将 MS Access 报告另存为 PDF/A(PDF ISO 19005 的存档版本)
- amazon-web-services - 为什么这个简单的 Flask 脚本需要这么长时间才能运行?
- java - 无法使用请求的结果为具有多个返回的查询创建 TypedQuery
- vb.net - 为什么这种基本的数字比较会产生不合逻辑的结果?
- ruby-on-rails - 从 Word 文档中提取页码 - Ruby on Rails
- python - 熊猫,分组并将多个列值聚合到一个字典中
- react-native - Expo v30.0 的 React-native-svg 使用问题
- sqlite - 从一个表中选择值,从另一个表中计算公共值,如果没有公共值则显示 0
- java - JAVA JDBC mySql Prepared statement 更新查询
- mysql - 终端错误中的 SQL:不匹配的输入“)”期望(在原始类型规范中靠近“VARCHAR”