直接在location块中启用referer校验,配置valid_referers白名单并用if($invalid_referer){return 403;}实现防盗链,适用于图片等静态资源。

直接在对应资源的 location 块中启用 referer 校验,并用 $invalid_referer 变量判断后返回 403 即可。关键在于 valid_referers 的配置要覆盖合法来源,且 if 判断必须放在同一作用域内。
明确需要保护的资源路径
通常针对图片、图标、字体等静态资源做限制,比如:
location ~* \.(jpg|jpeg|png|gif|webp|ico|woff2)$- 或更精确地限定目录:
location /images/或location ^~/assets/
配置合法 referer 白名单
在上述 location 块内写入 valid_referers 指令,支持多种匹配方式,满足任一即视为合法:
-
none:允许无 Referer 的请求(如用户直接输入图片地址) -
blocked:允许 Referer 存在但被浏览器/代理清空的情况(如 HTTPS 页面引用 HTTP 资源时自动清除 Referer) - 具体域名:
example.com www.example.com - 通配符:
*.example.com - 正则表达式:
~\.baidu\.或~^https?://(www\.)?myapp\.com
多个条件之间是“或”关系,无需额外逻辑组合。
添加 if 判断并返回 403
紧接着 valid_referers 写下判断语句:
if ($invalid_referer) { return 403; }- 注意:
if必须出现在同一个 location 块里,不能写在 server 级别再期望它对子 location 生效 -
$invalid_referer是内置变量,值为 1 表示不匹配白名单,0 或空表示匹配成功
验证与注意事项
配置完成后需重载 Nginx(nginx -t && nginx -s reload),然后测试几种典型场景:
- 直接浏览器访问图片 URL → 应返回 200(匹配
none) - 从本站页面点击图片链接 → 应返回 200(Referer 是自身域名)
- 从其他网站 HTML 中嵌入你的图片 → 应返回 403
- 使用 curl 模拟盗链:
curl -H "Referer: https://evil.com" https://yoursite.com/logo.png→ 返回 403
需留意 Referer 可被伪造,该方案防的是普通盗链,不适用于对抗恶意构造请求的场景。











