nginx分片防盗链需在匹配媒体后缀的location中配置valid_referers并兼容none/blocked及多域名,确保每个range请求均校验referer,同时正确设置alias路径与禁用干扰项。

分片防盗链不是 Nginx 原生支持的功能,它本质上是把“防盗链”和“HTTP Range 分片请求”两个机制组合使用,关键在于:防盗链规则必须对每个分片请求都生效,而不能只校验首次请求。Nginx 默认的 valid_referers 对所有子请求(包括带 Range 头的视频/音频分片)同样有效,但需注意配置位置、路径匹配与资源定位的一致性。
只在匹配分片资源的 location 中启用防盗链
多媒体文件(如 MP4、WEBM、MP3)常被前端通过 video 标签流式加载,浏览器会自动发起多个带 Range: bytes=xxx-yyy 的子请求。这些请求仍携带原始 Referer,所以防盗链逻辑必须覆盖所有可能触发分片的路径:
- 用正则精确匹配媒体后缀,避免误伤 HTML 或 API:
location ~* \.(mp4|webm|ogg|mp3|avi|mov|flv)$ - 不要写在
location /或location ^~ /static/这类宽泛前缀下——若该 location 内没配valid_referers,分片请求就绕过校验 - 如果媒体文件放在 CDN 回源路径(如
/cdn/video/),应单独配一个 location:location ^~ /cdn/video/ { ... }
确保 valid_referers 白名单兼容真实播放场景
视频直接访问、H5 播放器嵌入、微信内页跳转等场景的 Referer 差异大,白名单设置不当会导致合法分片被拦:
-
必含
none:允许用户复制视频链接直播(如分享到微信后点开) -
必含
blocked:覆盖隐私模式、某些安卓 WebView、企业防火墙清 Referer 的情况 -
域名要完整覆盖所有入口:比如主站
example.com、管理后台admin.example.com、H5 活动页h5.partner.com、甚至微信内置浏览器可能带weixin://协议(此时 Referer 为空或被截断,靠none和blocked拦)
配合 root/alias 与缓存策略,防止分片响应异常
分片请求返回的是 206 Partial Content,Nginx 必须能正确读取文件并切片。若防盗链 location 中路径配置错误,可能导致 404 或 500,进而中断播放:
- 若媒体文件在
/data/media/,且 URL 是/video/demo.mp4,推荐用alias:location ~* \.mp4$ { alias /data/media/; valid_referers none blocked example.com; if ($invalid_referer) { return 403; } } - 禁用该 location 的日志和缓存干扰调试:
access_log off;<br>add_header Cache-Control "no-store, no-cache";
(调试期用,上线后可设合理expires) - 避免在防盗链 location 内使用
rewrite跳转——分片请求不支持重定向,会导致播放失败
验证分片防盗链是否真正生效
不能只测完整文件下载,要模拟真实播放器行为:
- 用 curl 发起带 Range 和 Referer 的请求:
curl -H "Referer: https://baidu.com" -H "Range: bytes=0-1023" http://your.site/video/test.mp4 -I→ 应返回 403 - 同一命令换合法 Referer:
curl -H "Referer: https://example.com/play" -H "Range: bytes=0-1023" http://your.site/video/test.mp4 -I→ 应返回 206 - 检查 Nginx error log 是否有
open() "/data/media/..." failed (2: No such file)类报错,说明 alias/root 路径错位











