valid_referers通过白名单机制为静态资源设来源屏障,仅对匹配后缀的location生效,支持none、blocked、域名及正则白名单,拦截后宜return 403或rewrite占位图,需兼顾referer丢失场景。

用 valid_referers 构建静态资源的来源屏障,核心不是“堵住所有外链”,而是明确告诉 Nginx:哪些来源算合法,其余一律不放行图片、CSS、JS 等易盗用资源。它不加密、不验证身份,但能快速过滤掉绝大多数粗放式盗链。
只对目标资源启用,避免误伤关键路径
防盗链规则必须落在匹配具体静态文件的 location 块里,不能写在 server 根层级或 HTML 主入口中。常见做法是按后缀精准匹配:
-
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2|ttf)$—— 覆盖主流静态资源类型 - 排除
/favicon.ico、/index.html等非资源类请求,它们通常需要直接访问或被搜索引擎抓取 - 若项目用 Vue/React SPA,确保该 location 不干扰
try_files $uri $uri/ /index.html;的 fallback 逻辑
白名单配置要兼顾业务真实场景
valid_referers 是白名单机制,多个值之间是“或”关系。典型组合包括:
- none:允许用户直接在浏览器地址栏输入图片 URL 访问(比如分享链接、调试时)
-
blocked:接受被代理、防火墙或隐私模式“截断”后的 Referer(如只剩
https://yourdomain.com,无路径) -
yourdomain.com 和 *.yourdomain.com:覆盖主站和所有子域(注意:通配符
*.example.com不含example.com本身) -
~\.(cdn|assets)\.yourdomain\.com$:用正则支持 CDN 域名,末尾加
$防止hacker.com.example.com类误匹配
拦截后响应要合理且可控
判断 $invalid_referer 为真(即值为 1)后,推荐两种处理方式:
-
return 403;—— 最简洁明确,适合内部系统或对盗链零容忍场景 -
rewrite ^(.*)$ /images/forbidden.png break;—— 返回一张占位图,需确保该图片本身不参与防盗链(例如放在单独 location 中,或路径不匹配上述后缀规则) - 避免使用
redirect,否则会暴露真实资源路径,也增加一次 HTTP 跳转开销
上线前务必验证 Referer 行为边界
真实环境中 Referer 可能意外丢失,测试不能只靠 curl 模拟。重点检查:
- HTTPS 页面加载 HTTP 资源 → 浏览器强制清空 Referer → 必须含
none才能正常显示 - 从微信内置浏览器、某些 App WebView 打开页面 → Referer 可能为空或格式异常 →
blocked能覆盖部分情况 - 用户开启浏览器“严格 Referrer Policy”或使用隐私模式 → Referer 常被截断 → 白名单中加
blocked很关键 - 用
curl -H "Referer: https://bad-site.com" https://yoursite.com/test.jpg验证是否真返回 403










