nginx防盗链需用valid_referers限定合法来源并配合if判断拦截非法请求,精准匹配音视频路径或后缀,放行空referer及cdn回源等特殊场景,再通过curl和日志验证效果。

Nginx 防盗链保护音视频资源,核心是通过 valid_referers 限制来源域名,并配合 if 判断 + return 或 rewrite 拦截非法请求,同时注意对音视频这类大文件要避免误杀搜索引擎、APP内嵌或合法CDN回源。
明确需要保护的资源路径
音视频文件通常集中在特定目录或有统一后缀,比如 /media/、/video/、/audio/,或以 .mp4、.m3u8、.mp3、.flv 等结尾。建议按后缀或 location 区分处理,避免全局拦截影响静态资源:
- 用
location ~* \.(mp4|mp3|flv|m3u8|ts)$精准匹配音视频文件 - 或用
location ^~ /video/锁定整个目录(更推荐,便于后续加白名单) - 避免写成
location /下统一对所有请求校验 referer,易导致 CSS/JS 被误拦
配置合法来源并拒绝非法请求
在对应 location 块中启用 referer 校验。注意:空 referer(如直接输入 URL、APP 内打开、部分浏览器隐私模式)需酌情放行,否则用户无法直接播放:
- 使用
valid_referers列出允许的域名,支持通配符和正则,例如:
valid_referers none blocked server_names *.example.com ~\.baidu\.com$; -
none允许空 referer(适配 APP、微信内置浏览器等) -
blocked放行被防火墙或代理 stripped 的 referer(常见于某些 CDN 或企业网络) - 不要漏掉自己主站的 www 和非 www 版本,比如
example.com和www.example.com - 校验后用
if ($invalid_referer) { return 403; }拦截,不建议用rewrite跳转,防止泄露真实路径
兼容移动端与特殊场景
音视频常被 App、小程序、Iframe 嵌入,它们可能不带 referer 或 referer 不规范,需针对性放行:
- APP 内 WebView 通常无 referer,靠
none覆盖;若需更严格,可结合 UA 或自定义 header(如$http_x_app_token)辅助判断 - 微信公众号/小程序内访问,referer 是
https://servicewechat.com/...,可用正则匹配:
valid_referers ~^https?://servicewechat\.com; - CDN 回源请求一般带
X-Real-Referer或固定内部 IP,可在 upstream 或 if 中补充判断(如if ($http_x_real_referer ~* "example\.com") { set $allow_referer "1"; })
验证与日志辅助排查
上线前务必测试各种来源,避免一刀切封禁:
- 用 curl 模拟不同 referer:
curl -H "Referer: https://bad-site.com" https://yoursite.com/video/test.mp4 → 应返回 403
curl -H "Referer: https://example.com" https://yoursite.com/video/test.mp4 → 应正常返回 - 开启 access_log 中的 referer 字段,方便定位误拦:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 临时加
add_header X-Referer-Check $invalid_referer;响应头,前端调试时可快速确认校验结果











