协议边界
m3u8 CORS 错误通常发生在 hls.js 读取 playlist 或 segment 时。Safari 原生 HLS 和 hls.js 的网络路径不同,因此同一个源在不同浏览器里可能表现不同。
播放与检测逻辑
- playlist 和所有 segment 都需要正确 CORS 响应头,不能只给 master.m3u8 配 CORS。
- HTTPS 页面加载 http:// segment 会触发 mixed content,即使 m3u8 本身是 HTTPS。
- 源站应返回正确 MIME type,并处理 Range、缓存、鉴权过期等边界。
常见问题
只给 m3u8 加 CORS 够吗?
不够。hls.js 会继续请求子 playlist 和 segment,这些资源也必须允许跨域。
为什么 Safari 能播,Chrome 不能播?
Safari 可能走原生 HLS 管线,Chrome 通常走 hls.js + fetch/XHR + MSE,更容易暴露 CORS 和 MIME type 问题。
前端能绕过 m3u8 CORS 吗?
不能可靠绕过。正确做法是在源站/CDN 配 CORS,或用你控制的后端代理重写响应头。