valid_referers配合$invalid_referer和if是最轻量可靠的基础防盗链方式;须置于静态资源location块中按后缀精准匹配,白名单需包含none、blocked、主域及cdn域名等,动作推荐return 403或rewrite占位图。

直接用 valid_referers 配合 $invalid_referer 和 if 判断,是最轻量、最可靠的基础防盗链方式。它不加密、不鉴权,但能快速挡住绝大多数粗放式盗链,关键是配置位置和白名单组合要准。
只在静态资源 location 中启用
防盗链规则必须落在匹配具体文件类型的 location 块里,不能写在 server 根层级或 HTML 入口路径中。否则要么无效,要么误拦关键请求。
- 推荐按后缀精准匹配:比如
location ~* \.(jpg|png|css|js|woff2|mp4)$ - 避开
/favicon.ico、/index.html这类非资源路径,它们需要被直接访问或搜索引擎抓取 - 如果是 Vue/React 单页应用,确保该
location不干扰try_files $uri $uri/ /index.html;的 fallback 逻辑
白名单要覆盖真实访问场景
valid_referers 是“或”关系,满足任一即合法。常见组合需兼顾业务实际:
- none:允许用户直接输入图片 URL 访问(如分享链接、调试)
- blocked:接受被隐私插件、企业网关或 HTTPS→HTTP 跳转清空 Referer 后的请求
- yourdomain.com 和 *.yourdomain.com:注意通配符不包含主域名本身,两者建议都写上
-
~\.google\.com$ 或 ~\.baidu\.com$:加
$防止hacker.com.google.com类误匹配,点号记得转义 - 若走 CDN,把 CDN 域名(如
cdn.yourdomain.com)也加进白名单,或关闭 CDN 的 Referer 透传
拦截动作要明确且可控
判断 $invalid_referer 为真后,两种主流处理方式各适用不同场景:
-
return 403;:响应最简洁,适合内部系统或对盗链零容忍的资源 -
rewrite ^(.*)$ /images/forbidden.png break;:返回一张占位图,需确保该图片路径不匹配当前防盗链规则(例如单独放在/public/下,或用独立location放行) - 避免用
redirect,会暴露真实路径,还多一次 HTTP 跳转
别踩这些典型坑
很多配置看似正确却失效,问题往往出在细节:
-
valid_referers写在http或server块顶层——它只在server或location内生效 - 漏掉
none或blocked,导致自家页面在 HTTPS 环境下引用 HTTP 图片时 403 - 把
if块写在try_files或alias之后——Nginx 会先查文件,找不到就 404,根本不会执行 if - 用
alias时末尾没加斜杠,造成路径拼接错误,结果返回 404 而非预期的 403











