valid_referers实现基础防盗链的核心是白名单机制:仅放行none、blocked及指定域名(含通配符、协议前缀、正则)的referer请求,配合if($invalid_referer)返回403或自定义图,须精准作用于静态资源路径且不可替代真实鉴权。

用 valid_referers 做基础防盗链,核心是让 Nginx 只放行来自可信来源的资源请求,其他一律拦截。它不加密、不鉴权,只检查请求头里的 Referer 字段是否在白名单中,轻量但足够应对大部分盗链场景。
明确哪些 Referer 是合法的
在 location 块里用 valid_referers 指令定义允许的来源,常见组合有:
-
none:允许空 Referer,比如用户直接在浏览器地址栏输入图片 URL、从书签打开、或微信内置浏览器等不带 Referer 的情况 -
blocked:允许 Referer 被客户端主动清除(如某些隐私模式或插件屏蔽)的情况 -
具体域名:如
example.com、www.example.com,支持通配符*.example.com -
协议+域名完整写法:如
https://example.com,注意 http/https 要写全,否则可能不匹配
拦截非法请求并返回合适响应
定义完白名单后,Nginx 会自动设置内置变量 $invalid_referer(值为 1 表示不合法)。接着用 if 判断并处理:
- 返回 403 禁止访问:
if ($invalid_referer) { return 403; } - 重定向到默认提示图:
if ($invalid_referer) { rewrite ^/.*$ /img/forbidden.png break; }(需确保该图片本身不校验 Referer,否则会循环) - 注意:
if后必须有空格,否则配置会报错
精准作用于静态资源路径
不要在整站 server 块里加防盗链,而是聚焦在真正容易被盗的资源上,比如图片、图标、字体:
- 用正则匹配后缀:
location ~* \.(png|jpe?g|gif|webp|ico|woff2)$ - 避免对 HTML、JS、CSS 或 API 接口启用,否则可能影响正常页面加载或第三方 SDK
- 如果 Vue 或 React 单页应用部署在 Nginx,建议只对
/static/或/assets/下的媒体文件做校验
补充说明与注意事项
Referer 防盗链本质是“信任客户端声明”,所以有局限性:
- Referer 可被浏览器或工具伪造,不能替代身份认证或 Token 鉴权
- 部分场景天然无 Referer(如 HTTPS 页面引用 HTTP 图片、某些移动端 WebView),需结合
none和blocked保留可用性 - 翻译类工具(Google/Baidu Translate)常带 Referer 但非真实用户来源,可额外用
$http_user_agent过滤 - 搭配
add_header Access-Control-Allow-Origin "your-domain.com"可进一步约束跨域行为










