一、很多新手搞不懂 M3U8 里面两种路径格式
M3U8 索引里面,TS 分片、子 M3U8、密钥地址,有两种写法:绝对路径完整 URL、相对路径。很多开发分不清两者差异,代理、CDN、环境迁移的时候踩大量坑。
现象经常是:直接访问源站 M3U8 播放正常,经过 Nginx 代理之后,TS 分片 404;测试环境一切正常,部署到正式环境域名一变,全部分片 404 黑屏。很多人花大量时间排查 Nginx proxy_pass 配置,但是根源是 M3U8 内部 URL 路径写法。
简单通俗解释:
- 绝对路径:写完整 https 域名 + 完整资源地址,例如
https://xxx.com/1.ts; - 相对路径:不写域名,只写资源文件名,例如
1.ts、./sub/index.m3u8。相对路径拼接规则:以当前这份 M3U8 文件访问 URL 作为基准地址,拼接出完整请求地址。
很多人误以为相对路径是相对于服务器磁盘文件目录,这个理解是错误的,相对路径是基于浏览器 HTTP 访问的 URL 路径,不是服务器本地磁盘路径。
遇到路径相关 404 故障,我会使用 m3u8live.cn 网页调试工具,打开 M3U8 原始文本,直接查看里面分片是绝对路径还是相对路径,快速定位路径拼接问题。
二、绝对路径优缺点
✅优点:写死完整域名,不用关心 M3U8 访问路径层级,不会出现拼接错位。 ❌缺点:域名写死,测试、生产环境域名切换,或者经过代理网关转发,M3U8 报文内部域名不会自动变化,分片直接 404。如果要改写域名,必须使用 Nginx sub_filter 修改 M3U8 返回报文内容。
适用场景:域名固定,不会做代理转发改写域名的业务。
三、相对路径优缺点
✅优点:不写死域名,M3U8 在哪里访问,就自动继承当前访问域名。Nginx 代理、环境域名切换,不需要修改 M3U8 报文 body 内容,proxy_pass 直接转发就可以正常工作,这是代理场景优先推荐方案。 ❌缺点:对 URL 路径层级非常敏感。如果代理增加一层 URL 路径前缀,相对路径拼接会出错,导致分片 404。
重点:相对路径的基准,是浏览器访问这份 M3U8 的 HTTP URL,不是服务器磁盘文件位置。
四、高频路径踩坑场景
坑 1:源站 M3U8 写死绝对域名,Nginx 代理转发,分片 404
proxy_pass 只能转发 HTTP 请求,不会修改 M3U8 响应 body 内部的文本。M3U8 里面写死源站域名,代理之后浏览器读取 M3U8 里面的旧域名,直接请求源站域名,如果浏览器访问不到源站域名,分片 404。
坑 2:使用相对路径,代理增加 URL 路径前缀,路径层级错乱
源 M3U8 访问地址/live/index.m3u8,TS 写1.ts。代理之后访问地址变成/proxy/live/index.m3u8,浏览器会拼接成/proxy/live/1.ts。如果后端路径层级对不上,分片 404。
坑 3:Master 多码率主索引,子流路径写错,切换清晰度 404
Master 主索引里面子 M3U8 地址,相对路径基准是 Master 主索引的访问 URL,很多新手误以为是子文件所在磁盘目录,导致子流拼接错误,切换清晰度 404。
坑 4:把磁盘本地文件路径和 HTTP 访问 URL 路径混淆
很多运维把服务器磁盘目录,和浏览器 HTTP 访问路径混为一谈,导致相对路径配置怎么调都不对。
五、业务开发运维建议
- 如果业务要经过 Nginx 代理、网关转发 M3U8,优先源站输出相对路径,尽量不要写死绝对 URL,避免需要 sub_filter 替换报文。
- 如果业务必须使用绝对路径,代理场景要开启 sub_filter 做字符串替换,同时直播动态 M3U8 关闭代理缓存,防止替换后的旧报文被缓存。
- Master 多码率主索引,子流相对路径,以 Master 主索引 HTTP 访问 URL 作为基准做拼接,写路径的时候一定要考虑这一点。
- 排错直接看 M3U8 原始文本,观察分片地址写法,结合浏览器 F12 看分片最终拼接出来的完整请求 URL。
六、总结
M3U8 里面的相对路径、绝对路径是代理、环境迁移的时候高频踩坑点。相对路径基准是浏览器访问 M3U8 的 HTTP URL,不是服务器磁盘路径。经过 Nginx 代理的业务,优先源站输出相对路径,可以避免修改 M3U8 响应报文的麻烦。遇到分片 404,借助网页调试工具查看 M3U8 原始文本,再看浏览器实际请求出来的分片完整 URL,快速定位路径拼接问题。