HTML中meta标签和video的src时间戳对缓存无效,浏览器只认服务端响应头;禁用视频缓存需服务端同时移除ETag/Last-Modified、设置Cache-Control: no-store, must-revalidate,并防范CDN覆盖。

单纯靠 HTML 属性无法同时解决「浏览器缓存」和「投屏」两个问题——它们的机制完全不同,且各自有明确的失效边界。缓存由服务端响应头控制,投屏限制仅靠 disableRemotePlayback 提示,既不强制也不防录屏。
video 标签加 cache-control 或时间戳参数根本没用
HTML 里写 <video src="vid.mp4?t=123"> 或在 <meta> 里塞 Cache-Control,对视频文件是否缓存完全无效。浏览器只看服务端返回的 HTTP 响应头,尤其是 Cache-Control、ETag 和 Last-Modified。
- 即使 URL 带时间戳,只要服务端返回
Cache-Control: public, max-age=3600,浏览器照缓不误 -
ETag存在时,浏览器会发带If-None-Match的条件请求,哪怕你设了no-cache,也可能收到304 Not Modified—— 这就是“看似刷新实则走缓存” - 前端改
src后不调用load(),iOS Safari 可能复用旧解码器缓冲,导致画面没更新
禁用视频缓存必须服务端动手,且三要素缺一不可
要真正让每次播放都拉新数据,服务端需同时满足:清除协商缓存标识 + 设置强禁用策略 + 避免中间件覆盖。
- Node.js/Express:必须调用
res.removeHeader('ETag')和res.removeHeader('Last-Modified') - 响应头至少包含:
Cache-Control: no-store, must-revalidate(no-cache不够,它仍允许协商缓存) - Nginx 静态服务场景下,仅写
add_header Cache-Control不生效,必须配expires -1+etag off
disableRemotePlayback 不是开关,只是提示信号
这个属性只能影响部分浏览器对投屏 UI 的渲染逻辑,不是 DRM 级别的输出控制。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
立即学习“前端免费学习笔记(深入)”;
- 正确写法只有
<video disableRemotePlayback>—— 加=true或=disabled会让属性被完全忽略 - Chrome/Edge 支持较好;Safari 自 iOS 15.4 起支持 AirPlay 禁用提示;Firefox 完全不识别
- 它对系统级录屏(如 macOS QuickTime)、手机拍摄投屏画面、抓包提取分片 URL 全无约束力
想兼顾防缓存 + 降低投屏风险,得组合服务端策略
前端单点设置注定失效,真正可控的是服务端对每个播放请求的上下文校验与响应控制。
- 视频流必须走代理接口(如
/api/video/stream?videoId=xxx),而非直接暴露 S3 或 CDN 的预签名 URL - 接口需验证动态 Token(含用户 ID、UA Hash、5 分钟有效期),并为每次响应生成唯一、短时效的临时密钥
- 响应头同步设为
no-store+ 移除ETag,同时在 license server 或 DRM 输出策略中启用outputProtection(如要求 HDCP)
最常被忽略的一点:CDN 或反向代理(如 Cloudflare、Nginx proxy_pass)可能悄悄覆盖你设的响应头,务必用 curl -I 实测最终返回的 Cache-Control 和 ETag 是否符合预期。


















