原文链接:《通过设置响应头阻止浏览器缓存》
我在做HLS直播流功能的时候,遇到了在请求时总是会读取浏览器缓存,虽然可以在调试窗口中打开禁止浏览器缓存,但是总不能要求每个用户在使用的时候,需要打开调试窗口再开启禁止浏览器缓存吧!我也尝试了其它方法,例如,在请求接口后面拼接一段随机数,但是我使用的hls.js这个插件是一次性设置请求接口,找不到每次请求的时候更换随机数的方法。
使用响应头解决浏览器缓存问题
后来想到了接口的响应头,平时在出现跨域的情况都是可以设置Access-Control-Allow-Origin来告诉浏览器允许跨域吗?那是不是有对应的响应头可以告诉浏览器不要缓存这个接口的数据呢?别说,还真有!
# 禁止浏览器和代理服务器缓存
add_header 'Cache-Control' 'no-cache, no-store, must-revalidate';
add_header 'Pragma' 'no-cache';
add_header 'Expires' '0';
上面的代码就是在nginx中设置响应头来告诉浏览器不要缓存这个接口的数据,我只需要在nginx代理的直播流接口中设置这一段就解决了浏览器缓存问题。
顺带的来简单说明一下HLS来凑个字数吧!
-
HLS(HTTP Live Streaming)是一种由苹果公司开发的基于HTTP的流媒体传输协议,广泛应用于视频直播和点播服务中。以下是HLS直播流的关键特性和工作原理概览:
-
分段存储:HLS将连续的媒体流分割成一系列短时长的文件,通常每个片段几秒到几十秒长。这些文件通常使用MPEG-2 Transport Stream(TS)格式进行封装。
-
M3U8播放列表:为了指导客户端如何按顺序播放这些片段,HLS使用一个包含元数据的扩展M3U播放列表文件(通常以.m3u8为扩展名)。这个文件列出了所有可用的媒体片段以及它们的URL,还有可能包括不同质量的流信息,以便实现自适应比特率流式传输。
-
自适应比特率:HLS支持多比特率流,意味着服务端可以提供不同分辨率和质量的视频流。客户端可以根据当前的网络条件自动选择最适合的比特率进行播放,从而优化用户体验。
-
基于HTTP的传输:所有媒体片段和播放列表都是通过标准的HTTP协议进行传输的,这意味着HLS能够穿透防火墙和代理服务器,且几乎可以在所有支持HTTP下载的设备上使用,包括网页浏览器(通过HTML5的video标签)、移动设备和智能电视等。
-
低延迟改进:虽然传统HLS可能会有较高的延迟(通常十几秒到几十秒),但近年来苹果和其他组织引入了低延迟HLS(LL-HLS)规范,旨在减少直播内容的传输延迟,使之接近实时或仅有几秒的延迟。
由于HLS依赖于一系列的TS分片文件来播放流媒体内容,浏览器可能会缓存这些分片。如果直播内容更新了(例如新的分片替代了旧的),而浏览器仍然使用旧的缓存分片,这可能导致播放内容不准确或重复。缓存行为有时会增加直播内容的展示延迟,尤其是在低延迟HLS(LL-HLS)场景中,因为任何额外的缓存层都可能与减少延迟的目标相冲突。