Nginx防盗链需在valid_referers中显式包含none并叠加可信域名,配合$invalid_referer拦截;none支持空Referer的合法访问,blocked兼容Referer被剥离场景,白名单须含自身域名及合作方全称。

要让 Nginx 防盗链既放行直接访问(空 Referer),又允许合作方网站引用资源,关键是在 valid_referers 指令中**显式包含 none 并叠加其他可信来源**,再配合 $invalid_referer 做拦截判断。
必须写上 none 才能支持直接访问
用户在浏览器地址栏输入 URL、用书签打开、新标签页跳转、微信内嵌浏览器或部分 App WebView 加载页面时,Referer 头通常为空或缺失。如果不加 none,这些合法访问会被误拦。
-
none 是一个关键字,不是空字符串,不能写成
""或留空 - 它必须出现在
valid_referers行中,位置无关(可放最前、中间或最后) - 仅当请求头完全不含 Referer 字段,或字段值为空时,
$invalid_referer才不会被触发
白名单要覆盖合作方域名和自身站点
除了 none,你还应列出所有需要放行的来源:自己的主站、子域名、以及明确授权的合作方域名。
- 用 server_names 自动匹配当前
server_name(含 www 和非 www 变体) - 用 *.example.com 支持全部子域名(注意星号不需引号,但正则模式下需转义)
- 合作方域名写全称,如 partner-site.com 或 www.partner-site.com,多个用空格分隔
- 避免只写
https://partner-site.com—— Referer 值不含协议,只比对域名部分
配置示例与常见错误
以下是一个兼顾空 Referer 和合作方的典型配置(放在匹配静态资源的 location 块中):
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2?)$ {
valid_referers none blocked server_names *.myapp.com partner-site.com www.partner-site.com;
if ($invalid_referer) {
return 403;
}
}- blocked 一并加上,兼容被代理/防火墙剥离 Referer 的情况(值存在但不以 http/https 开头)
- 不要把这段配置放在
http或server根层级——valid_referers只在server或location内有效 - 避免用
location /全局匹配,否则可能阻断首页 HTML 或 API 请求 - 如果合作方是 HTTPS 站点,而你的资源是 HTTP,浏览器可能按 Referrer Policy 清除 Referer;此时更依赖 none 和 blocked 来兜底
验证是否生效的小技巧
配置后 reload Nginx,可通过 curl 快速测试不同 Referer 场景:
- 模拟空 Referer:
curl -H "Referer:" https://yoursite.com/test.jpg→ 应返回图片 - 模拟合作方 Referer:
curl -H "Referer: https://partner-site.com/page" https://yoursite.com/test.jpg→ 应返回图片 - 模拟盗链 Referer:
curl -H "Referer: https://bad-site.com" https://yoursite.com/test.jpg→ 应返回 403


















