nginx 用 valid_referers 设白名单实现静态资源防盗链,仅校验 referer 字段是否匹配 none、blocked、域名、正则等规则,需置于精准匹配静态后缀的 location 块中,配合 if($invalid_referer) 返回 403 或占位图。

直接用 valid_referers 设置白名单,是 Nginx 实现静态资源引用控制最常用的方式。它不加密、不鉴权,只检查请求头里的 Referer 字段是否落在你认可的范围内,轻量但有效。
白名单写法要覆盖真实访问场景
多个值之间是“或”关系,满足任一即放行。常见组合包括:
- none:允许用户直接在地址栏输入 URL 访问(如分享图片链接、调试时)、HTTPS 页面加载 HTTP 资源被浏览器清空 Referer 的情况
-
blocked:接受 Referer 存在但被截断的请求(比如只剩
example.com,没有协议和路径),常见于微信内置浏览器、某些 App WebView 或开启严格 Referrer Policy 的环境 -
example.com 和 *.example.com:分别匹配主域名和所有子域;注意通配符
*.example.com不包含example.com本身,需同时写上 -
server_names:自动匹配当前
server_name指令中列出的所有域名,适合多域名共用一份配置的场景 -
~\.cdn\.example\.com$:用正则匹配 CDN 域名,末尾加
$防止hacker.com.example.com类伪造
必须放在精准匹配静态资源的 location 块里
防盗链规则不能写在 server 根层级或 HTML 入口路径中,否则会误伤正常页面请求。推荐按后缀匹配主流静态类型:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2|ttf|mp4)$- 排除
/favicon.ico、/index.html等非资源类路径,它们通常需要直接可访问 - 若用 Vue/React SPA,确保该 location 不干扰
try_files $uri $uri/ /index.html;的 fallback 逻辑
拦截后响应要合理可控
校验靠 valid_referers,动作靠 if ($invalid_referer)。推荐两种处理方式:
-
return 403;:最简洁明确,适合内部系统或对盗链零容忍场景 -
rewrite ^(.*)$ /images/forbidden.png break;:返回一张占位图,需确保该图片路径本身不匹配上述后缀规则(例如单独配一个不带防盗链的location = /images/forbidden.png) - 避免用
redirect,否则会暴露真实资源路径,也增加一次 HTTP 跳转开销
上线前重点验证 Referer 边界行为
真实环境中 Referer 容易丢失或异常,不能只靠 curl -H "Referer: xxx" 测试。务必检查:
- HTTPS 页面加载 HTTP 静态资源 → 浏览器强制清空 Referer → 必须含
none - 微信、钉钉等 App 内置浏览器打开 → Referer 可能为空或格式异常 →
blocked很关键 - 用户开启隐私模式或设置严格 Referrer Policy → Referer 常被截断 → 白名单中加
blocked覆盖部分情况











