Nginx防盗链应精准匹配资源后缀或目录,用valid_referers设白名单,非法请求通过return 302跳转至独立/notice.html引导页,并单独放开该页访问限制。

在 Nginx 中配置防盗链并返回友好引导页,关键是在拦截非法 Referer 后不直接返回 403,而是用 rewrite 或 return 跳转到一个专门设计的提示页面(如 /notice.html),同时确保该页面本身不被防盗链规则误拦。
定位要保护的资源路径
防盗链应精准作用于高风险静态资源,避免影响首页、JS、CSS 等核心文件。推荐两种写法:
-
按后缀匹配:适用于图片、图标等常见资源,例如:
location ~* \.(jpg|jpeg|png|gif|webp|ico|svg|pdf)$ -
按目录匹配:若所有图片统一放在
/static/img/下,可写:location /static/img/
设置 Referer 白名单并启用拦截逻辑
在对应 location 块中使用 valid_referers 明确允许的来源,并用 if ($invalid_referer) 触发后续动作:
-
none:允许用户直接输入 URL、书签访问、部分 App 内打开(无 Referer) -
blocked:允许 Referer 存在但被代理/防火墙清洗后的请求(如值为https://以外的字符串) -
server_names:自动包含当前server_name及其 www 变体 -
*.example.com:显式支持子域名(注意实际配置中建议用正则~\.example\.com$更安全) -
https://partner.com:添加可信合作方域名(多个用空格分隔)
重写跳转到引导页(推荐 302 临时跳转)
非法请求应跳转至一个独立、可公开访问的提示页,例如 /notice.html。需注意两点:
- 该页面必须放在**不受防盗链规则影响的 location 中**(比如放在根路径或单独 location),否则会陷入循环或 403
- 使用
return 302比rewrite ... redirect更简洁可靠,且不依赖 PCRE 正则引擎
示例配置:
location ~* \.(png|jpe?g|gif|webp|ico)$ {valid_referers none blocked server_names ~\.mydomain\.com$ https://trusted-site.com;
if ($invalid_referer) {
return 302 https://mydomain.com/notice.html;
}
}
引导页本身要可访问且体验友好
/notice.html 应满足:
- 静态 HTML 文件,内联 CSS/JS,不引用外部图片或字体(或确保这些资源也豁免防盗链)
- 页面内容清晰说明“资源不可外链”,可附联系方式或版权提示
- 在 Nginx 中为其单独放开限制,例如:
location = /notice.html {<br> add_header Cache-Control "public, max-age=3600";<br> # 不加 valid_referers,也不在防盗链 location 内<br>}


















