Nginx可通过valid_referers配合if($invalid_referer)实现防盗链,需精准匹配资源后缀(如.jpg/.mp4等),设置none、blocked及合法域名白名单,并返回403或302提示图,上线前须用curl和nginx -t验证。

直接在 Nginx 的 server 或 location 块中配置 valid_referers 规则,配合 if ($invalid_referer) 判断,就能有效拦截非法引用,大幅减少图片、视频等静态资源被外站盗用导致的带宽浪费。
明确要保护的资源类型
先梳理哪些后缀文件容易被盗链——通常是图片(.jpg/.png/.webp)、视频(.mp4/.mov)、字体(.woff2)、文档(.pdf/.zip)等。配置时用正则精准匹配,避免误伤或漏防:
- 推荐写法:
location ~* \.(jpg|jpeg|png|gif|webp|mp4|pdf|zip|woff2)$ - 注意加
~*表示大小写不敏感,覆盖常见拼写变体 - 不要把所有静态资源(如 CSS/JS)都套用防盗链规则,否则可能影响页面正常加载
设置合法来源白名单
通过 valid_referers 指令定义允许访问的 Referer,关键参数含义要清楚:
-
none:允许直接输入 URL 访问(比如用户收藏夹点开图片) -
blocked:允许被代理、隐私模式或某些浏览器插件屏蔽 Referer 后的请求 -
yourdomain.com和*.yourdomain.com:明确放行主站及所有子域名 - 多个域名用空格分隔,例如:
valid_referers none blocked example.com *.example.com partner-site.com;
拦截非法请求并合理响应
检测到不合规 Referer 后,不建议只返回空白或 404,应兼顾用户体验与防护效果:
- 最简方式:
return 403;—— 快速阻断,适合纯技术防护场景 - 更友好方式:
return 302 /static/forbidden.png;—— 跳转到一张提示图(需确保该图本身不防盗链) - 避免使用
rewrite+last,易引发循环或性能开销
验证与上线前检查
配置生效前务必测试,防止误拦或失效:
- 执行
nginx -t确认语法无误 - 用 curl 模拟不同 Referer:
curl -H "Referer: https://badsite.com" http://yoursite.com/test.jpg应返回 403 - 检查自身页面内引用是否正常:
curl -H "Referer: https://yoursite.com/page.html" http://yoursite.com/test.jpg应返回 200 - 日志中关注
$invalid_referer变量值,便于排查漏配或误判


















