正确配置 valid_referers 防盗链需将 valid_referers 与 root/alias 同置于匹配大文件后缀的 location 块内,显式列出 mp4|zip|pdf 等扩展名,白名单包含 none、blocked 及主站、CDN 域名,拦截统一 return 403。

配置 valid_referers 保护大文件存储目录,核心是让防盗链逻辑与路径映射严格绑定在同一个 location 块内,并针对大文件特性做适配——比如避免误拦下载入口、防止超时中断、确保返回状态码明确。
必须把 valid_referers 和 root/alias 写在同一个 location 里
大文件(如 MP4、ZIP、PDF)通常存放在独立目录(如 /downloads/ 或 /media/),不能依赖 server 级的 root。否则 Nginx 无法解析 $uri 对应的真实磁盘路径,防盗链会失效或触发 404。
- ✅ 正确:用前缀匹配定位目录,
root或alias和valid_referers全部写在该location内 - ❌ 错误:server 块设了
root /var/www,location 里只写valid_referers—— 没有上下文路径,$invalid_referer判断可能跳过,或文件根本找不到
按后缀精准匹配大文件类型,避开关键接口
不要用宽泛的正则(如 .*),应显式列出大文件扩展名,同时排除可能被误拦的下载入口页面(如 /download?id=123 是动态接口,不是静态资源)。
- 推荐写法:
location ~* \.(mp4|avi|mkv|zip|rar|pdf|iso)$ - 避免写成:
location /downloads/后再靠 try_files fallback —— 如果没配好,if ($invalid_referer)可能不执行 - 若目录下混有 HTML 下载页(如
/downloads/index.html),单独用另一个location = /downloads/index.html放行,不套防盗链
白名单要覆盖真实使用场景,尤其注意 CDN 和 HTTPS 跳转
大文件常通过 CDN 分发或嵌入 HTTPS 页面,Referer 清空更频繁。白名单漏掉 none 或 blocked,会导致自家用户点击下载链接就失败。
- 必加项:
none(直接访问下载链接)、blocked(HTTPS 页面引用 HTTP 资源、隐私插件拦截) - 主站域名:
yoursite.com和*.yoursite.com都写上(通配符不包含主域本身) - 若走 CDN:
cdn.yoursite.com或 CDN 提供商域名(如cloudflare.net)也要加入 - 可选补充:
~\.google\.com$、~\.baidu\.com$(加$防止域名伪造)
拦截动作推荐 return 403,慎用 rewrite 占位图
大文件体积大,返回一张提示图看似友好,但风险高:图片本身可能被再次盗链;若未单独放行,会陷入循环 403;且状态码变成 200,掩盖真实拦截行为,不利于日志分析和监控。
- ✅ 推荐:
return 403;—— 响应轻量、语义清晰、便于客户端识别失败 - ⚠️ 若必须返回提示页,需另配一个不防盗链的 location,例如:
location = /static/hotlink-denied.png { alias /var/www/shared/hotlink-denied.png; } - ? 避免:
rewrite ^/ ... redirect—— 302 跳转会暴露真实路径,还多一次请求,对大文件尤其不友好











