valid_referers防盗链需三步:限定图片路径、列明白名单、拦截非法请求;须配合if($invalid_referer)使用,白名单必含none和blocked,location需精确匹配图片后缀,避免误伤资源。

用 valid_referers 配置基础防盗链,核心就三步:限定要保护的图片路径、列清楚谁可以访问、拦住不合规的请求。它不防伪造,但能挡住大多数自动盗链和粗放爬虫,配置快、见效快。
只对图片后缀生效,避免误伤关键资源
别在根路径或整个静态目录上加防盗链,容易把 CSS、JS 或 Vue 的 history fallback 一起拦掉。专注匹配图片格式:
- 用
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico)$精确捕获常见图片请求,~*表示忽略大小写 - 如果还要保护视频或 PDF,可扩展为
\.(jpg|png|mp4|pdf|zip)$,但建议分开配置,便于后续调整 - 避免写
location /static/这类宽泛路径——它可能覆盖掉你本想放行的 JS 文件或接口代理规则
白名单必须包含 none 和 blocked,否则自家页面也打不开
valid_referers 不是“只允许这些”,而是“匹配上就让 $invalid_referer 为 0”。漏掉关键类型,就会误拦合法用户:
-
none:允许直接在浏览器输图地址、点书签、HTTPS 页面引用 HTTP 图片(浏览器会清 Referer) -
blocked:覆盖微信内嵌浏览器、某些防火墙或代理修改后的 Referer(比如只剩localhost或路径) -
server_names或具体域名:如example.com *.example.com;通配符只支持前缀(*.example.com✅,example.*❌) - 可选加主流搜索引擎:
~\.google\. ~\.baidu\. ~\.bing\.,注意点号要转义,且必须以~开头
用 if 判断 $invalid_referer,拦截动作要放在正确位置
只写 valid_referers 没用,必须配合 if ($invalid_referer) 才真正起效。还要注意 Nginx 的执行顺序:
- 典型写法:
if ($invalid_referer) { return 403; }或重定向到提示图:rewrite ^(.*)$ /images/hotlink-denied.png break; - 如果用了
try_files(比如 Vue 的 history fallback),防盗链if必须写在它前面;否则文件找不到先返回 404,根本走不到拦截逻辑 - 提示图本身不能受防盗链限制,需单独加一个
location = /images/hotlink-denied.png块并跳过校验
配置完必须验证,别信“reload 就生效”
上线前花两分钟测几件事,能避开 90% 的线上事故:
- 本地打开网页,确认图片正常加载(检查是否漏了
none或协议不一致) - 用 curl 模拟盗链:
curl -H "Referer: https://bad-site.com" https://yoursite.com/test.jpg,看是否真返回 403 - 查 Nginx 日志,加上
$invalid_referer $http_referer字段,观察真实误拦情况 - 如果用了 CDN,确认它透传
Referer头;否则所有请求都像“没 Referer”,全被当成none放行或全拦掉










