nginx防盗链核心是用valid_referers设白名单并配合if($invalid_referer)拦截非法referer请求,仅作用于图片、视频等静态资源后缀,返回403或自定义提示图。

限制外部盗链,核心是让 Nginx 拒绝来自非授权域名的资源请求。最常用、最直接的方式就是用 valid_referers 定义白名单,再配合 if ($invalid_referer) 做拦截。不需要复杂逻辑,几行配置就能生效。
明确要保护的资源类型
先确定哪些文件不能被外站引用,通常是静态资源:
- 图片类:
.jpg .jpeg .png .gif .webp .bmp .ico - 媒体类:
.mp4 .mov .flv .avi .webm - 文档/下载类:
.pdf .zip .rar .docx .xlsx
把这些后缀写进 location 的正则匹配里,精准作用于目标资源,避免误伤 CSS、JS 或 API 接口。
设置合法 Referer 白名单
在对应 location 块中加入 valid_referers 指令,只放行你认可的来源:
-
none:允许直接在浏览器地址栏输入 URL 访问(比如用户收藏了图片链接) -
blocked:允许被代理或隐私模式下 Referer 被清空的情况 -
yourdomain.com:主域名(如example.com) -
*.yourdomain.com:所有子域名(如blog.example.com、cdn.example.com) - 多个域名用空格分隔,例如:
valid_referers none blocked example.com *.example.com partner-site.net;
拦截非法请求并返回合理响应
白名单设好后,Nginx 会自动把不匹配的请求标记为 $invalid_referer = "1"。接下来做处理:
- 返回 403 禁止访问(最常用):
if ($invalid_referer) { return 403; } - 返回自定义提示图(对图片资源友好):
if ($invalid_referer) { rewrite ^/.*$ /img/forbidden.png break; } - 跳转到首页或提示页:
if ($invalid_referer) { return 302 https://example.com/notice.html; }
注意:if 不能放在 server 或 http 块顶层,必须嵌套在 location 内;且不要在 if 中使用 proxy_pass 等复杂指令,易出问题。
验证是否生效
配置完别急着 reload,先检查语法:nginx -t。确认无误后重载:nginx -s reload。然后用以下方式验证:
- 本地浏览器直接打开图片链接 → 应能正常显示(Referer 为空,属于
none) - 用 curl 模拟盗链:
curl -e "https://badsite.com" https://example.com/photo.jpg→ 应返回 403 或自定义图 - 查 Nginx 日志,看是否有大量
403并带非法 Referer 记录











