基于referer的白名单防盗链需在location块中用valid_referers配合if判断实现,支持none、blocked、精确域名、通配子域和正则匹配五种放行类型,并通过$invalid_referer变量控制返回403或重定向提示图,应仅作用于静态资源路径且需验证移动端等无referer场景。

直接在 location 块里用 valid_referers 指令加 if 判断,就能实现基于 Referer 的白名单防盗链。它不加密、不鉴权,但对大多数普通盗链有效,配置轻量且生效快。
明确要放行的来源类型
白名单不是只写几个域名那么简单,得覆盖真实访问场景中可能出现的 Referer 类型:
- none:允许直接输入 URL、书签访问、HTTPS 页面引用 HTTP 资源等导致 Referer 为空的情况
- blocked:允许 Referer 存在但被浏览器或代理清空(如值不含 http:// 或 https://)的情形
-
精确域名:如
www.example.com,只匹配该完整域名(不含协议和路径) -
通配子域:如
*.example.com,匹配 blog.example.com、cdn.example.com 等 -
正则匹配:以
~开头,如~\.baidu\.com$,末尾加$防止误匹配(如避免baidu.com.hacker.site被放过)
把 valid_referers 和 if 结合使用
valid_referers 本身不拦截请求,只设置内置变量 $invalid_referer(合法为 0,非法为 1)。必须配合 if 才能生效:
- 写法示例:
if ($invalid_referer) { return 403; } - 不要写成
if ($invalid_referer = 1)—— Nginx 的if不支持数值比较,只认变量本身真假 - 若想返回一张提示图而非 403,可用
rewrite ^/.*$ /images/forbidden.png break;(注意是内部重定向,不暴露真实路径)
针对特定资源类型精准匹配
别在根 location 里全局加防盗链,应聚焦静态资源后缀,避免误伤 API 或页面请求:
- 用正则匹配常见媒体格式:
location ~* \.(jpg|jpeg|png|gif|webp|mp4|avi|flv|pdf|zip)$ - 确保该 location 块内已定义
root或alias,否则资源找不到会报 404 - 如果资源放在独立目录(如
/img/),可直接写location /img/ { ... },更简洁
验证与注意事项
配置完 reload nginx 后,建议用 curl 快速验证:
- 正常访问:
curl http://yoursite.com/img/test.jpg(Referer 为空,应放行) - 模拟盗链:
curl -e "https://bad-site.com" http://yoursite.com/img/test.jpg(应返回 403 或提示图) - Referer 可被伪造,所以它只是第一道防线,敏感资源建议叠加 URL 签名或登录态校验
- 移动端 WebView、某些 PWA 场景可能不带 Referer,测试时需覆盖这些情况











