Nginx防盗链对音频分片与完整下载一视同仁,仅校验每个HTTP请求的Referer头;需在location中覆盖.m3u8、.ts等分片及清单文件后缀,白名单应包含none、blocked及合法域名,并配置CORS与Range支持。

针对带防盗链保护的音频流文件(如 MP3、AAC、M4A、FLAC 等),Nginx 的 Referer 限制本身不区分“分片加载”或“完整下载”,它只校验每个 HTTP 请求头中的 Referer 字段。所谓“分片加载”(如 HLS 的 .ts 片段、DASH 的 .mp4 分片,或浏览器媒体播放器发起的 Range 请求)本质仍是独立的 HTTP GET 请求,每一片都会携带 Referer —— 因此只需确保防盗链规则覆盖所有分片路径和请求特征,而非额外配置“分片规则”。
明确分片资源的匹配范围
音频流分片常通过特定后缀或路径结构暴露,需在 location 块中精准覆盖:
- 常见分片格式后缀:HLS 使用
.ts,DASH 使用.mp4、.m4s、.mpd(清单文件),自定义分片可能用.aac、.chunk等 - 路径特征:如
/audio/stream/123456/下的0001.ts、manifest.m3u8,或/chunks/album123/ - 务必把
.m3u8、.mpd、.json(如播放器配置)等清单/元数据文件也纳入防盗链范围,否则攻击者可绕过直接请求分片
Referer 白名单必须兼容播放器行为
现代音频播放器(如 HTML5
- 若音频嵌入在
https://player.example.com/embed.html,分片请求 Referer 多为该地址;白名单应包含player.example.com及其子域 - 部分跨域 iframe 场景下 Referer 可能被浏览器截断或设为空,必须保留
none选项,否则首片加载失败 - 移动端 WebView 或 PWA 可能触发
blockedReferer(如隐私模式、代理过滤),建议显式加入blocked提升兼容性
避免误拦截 Range 请求与 CORS 预检
分片加载频繁使用 Range 请求(HTTP 206 Partial Content)及跨域场景,需注意:
-
valid_referers对Range请求同样生效,无需单独处理;但若返回 403,播放器会中断加载 —— 故白名单必须完整,不可遗漏合法来源 - 若前端跨域请求(
crossorigin="anonymous"),浏览器会先发 OPTIONS 预检请求;该请求无 Referer 头,必须含none,否则预检失败导致后续分片全部阻断 - 不要在防盗链 location 中意外覆盖
add_header Access-Control-Allow-Origin,否则跨域分片无法加载
推荐配置示例(兼顾分片与清单文件)
放在对应 server 或 location 块内,专用于音频流资源:
location ~* \.(m3u8|mpd|ts|m4s|aac|mp4|chunk|json)$ {
# 允许空 Referer(直接访问、预检、隐私模式)、被屏蔽的 Referer、主站及播放器域名
valid_referers none blocked *.example.com example.com player.example.com;
<pre class="brush:php;toolbar:false;">if ($invalid_referer) {
return 403;
# 或重定向到占位音频:rewrite ^(.*)$ /audio/denied.mp3 break;
}
# 确保分片响应支持 Range 和 CORS(若需跨域)
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, OPTIONS";
add_header Access-Control-Allow-Headers "Range";
# 可选:缓存分片提升性能(注意 m3u8/mpd 通常需短缓存)
expires 1h;
add_header Cache-Control "public, max-age=3600";}











