video标签缓存由服务端响应头决定而非HTML属性;需在Node.js/Express中设置no-store、移除ETag,Nginx中配置expires -1和etag off,并在前端调用load()强制刷新。
video 标签加 cache-control: no-cache 没用浏览器对 的缓存行为不由 HTML 属性控制,而是由服务器返回的 HTTP 响应头决定。即使你在 HTML 里写 ,只要服务端响应头带 Cache-Control: public, max-age=3600,浏览器仍会缓存。关键在服务端配置,不是前端加参数或属性。
在提供视频文件的路由中,必须显式设置响应头,并确保不被后续中间件覆盖。常见错误是只设了 Cache-Control 却漏掉 ETag 和 Last-Modified——这两个字段一旦存在,浏览器可能仍发起条件请求(304 Not Modified),导致“看似没重载实则用了缓存”。
ETag:用 res.removeHeader('ETag')
res.set('Cache-Control', 'no-store, must-revalidate')
?t=xxx 参数,它无法阻止服务端返回可缓存响应头app.get('/video/:i
d', (req, res) => {
const filePath = path.join(__dirname, 'videos', req.params.id);
res.removeHeader('ETag');
res.set({
'Cache-Control': 'no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
});
res.sendFile(filePath);
});如果视频走静态文件服务(比如 Nginx 直接 serve /videos/),需在 location 块中覆盖默认缓存策略。注意:不能只写 add_header,必须配合 expires 和 etag off,否则 add_header 可能被忽略或与内置逻辑冲突。
expires -1 表示立即过期(比 0 更可靠)etag off 强制关闭 ETag 生成if ($request_filename ~* \.mp4$) 做条件判断——Nginx 的 if 在 location 内不可靠location /videos/ {
alias /var/www/static/videos/;
expires -1;
add_header Cache-Control "no-store, must-revalidate, max-age=0";
etag off;
}src 并清除 MediaElement 缓存即便服务端配置正确,某些浏览器(尤其是 iOS Safari)对 的 src 切换有内部缓冲机制。单纯改 src 值(如加时间戳)不够,还需调用 load() 并监听 canplay,否则可能复用旧解码器状态。
src 后必须调用 video.load(),不能只靠 DOM 更新load() 导致卡顿;可在 onstalled 或 onerror 时再触发URL.createObjectURL(new Blob(...)) 动态生成视频 URL 后直接播放,会静音或失败const video = document.getElementById('myVideo');
video.src = '/video/clip.mp4?t=' + Date.now();
video.load(); // 必须显式调用
video.addEventListener('canplay', () => {
video.play();
}, { once: true });服务端响应头才是决定性因素,前端加参数只是辅助手段;no-store 比 no-cache 更彻底,而 etag off 和 expires -1 是容易被忽略的硬性配套操作。
# html
# js
# 前端
# node.js
# node
# html5
# nginx
# 浏览器
# app
# safari
# ios
# 路由
# 中间件
# express
# if
# public
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11如何设置ipv6 Win11开启IPv6网络协议教程【步骤】
Win11怎么开启智能存储_Windows11存储感知自动清理文件
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】
Python大型项目拆分策略_模块化解析【教程】
Win11快速助手怎么用_Win11远程协助连接教程【工具】
Win11怎么关闭开机声音_Win11系统启动提示音静音【教程】
Mac怎么开启“任何来源”_Mac安装未签名应用的设置方法【解决】
Win10怎样清理C盘Steam游戏缓存_Win10清理Steam游戏缓存步骤【步骤】
windows如何测试网速_windows系统网络速度测试方法
Python脚本参数接收_sys与argparse解析【指导】
VSC里PHP变量未定义报错怎么解决_错误抑制技巧【解答】
php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】
How to Properly Use NumPy in VS Code
如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理
Windows如何使用注册表查找和删除项?(regedit教程)
Go 中 defer 语句在 goroutine 内部不返回时不会执行
如何使用Golang log记录不同级别日志_Golang log Println与Fatal示例
Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】
如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法
Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧
如何在Golang中实现自定义Benchmark_Golang testing.B自定义性能测量示例
XAMPP 启动失败(Apache 突然停止)的终极排查与修复指南
Win11怎么设置系统还原_Windows11系统属性保护设置
Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】
Python技术债务管理_长期维护解析【教程】
Python异步编程高级项目教程_asyncio协程任务管理实战
c++ try_emplace用法_c++ map高效插入数据
Mac如何彻底清理浏览器缓存?(Safari与Chrome)
Python字符串操作教程_切片拼接与格式化详解
如何使用Golang读取日志文件_Golang bufio Scanner日志处理示例
Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】
Win11怎么开启专注模式_Windows11时钟应用Focus Session
Win11无法识别耳机怎么办_解决Win11插耳机没声音问题【步骤】
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法
Linux如何安装Tomcat应用服务器_Linux环境部署与端口修改【教程】
c++ std::future和std::promise c++线程间通信【教程】
如何使用Golang搭建本地API测试环境_快速验证接口功能
Win11文件夹预览图不显示怎么办_Win11缩略图缓存重建修复【教程】
Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】
Windows10系统怎么查看硬盘健康_Win10 SMART信息检测工具
Windows10如何更改桌面背景_Win10个性化幻灯片放映设置
php转mp4怎么保留字幕_php处理带字幕视频转换说明【说明】
Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】
Win11文件扩展名怎么显示_Win11查看文件后缀名设置【基础】
Win11怎么关闭防火墙通知_屏蔽Win11安全中心安全警告弹窗【技巧】
c++中的Tag Dispatching是什么_c++利用标签分发优化函数重载【元编程】
2025-12-31
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。