最直接有效的防盗链方式是在静态资源 location 块中用 valid_referers 定义合法来源并结合 $invalid_referer 拦截;需按后缀或路径精准匹配,白名单须含 none、blocked、主域、子域及 CDN 域名;拦截应 return 403 或 rewrite 至提示图,禁用 redirect。

最直接有效的方式,是在匹配静态资源的 location 块中,用 valid_referers 定义合法来源,并结合 $invalid_referer 变量做拦截判断。
只在精准匹配的 location 中配置
防盗链规则必须落在专门处理图片、图标等资源的路径里,不能写在 server 根层或 HTML 入口位置。否则容易误拦 JS、CSS 或首页请求。
- 推荐按后缀匹配:例如
location ~* \.(jpg|png|gif|webp|ico|svg)$ - 若只保护
/img/目录,可写成location /img/ - 避免用
location /全局配置,它会干扰正常页面访问
白名单要覆盖真实访问场景
valid_referers 是“或”关系,满足任一即放行。常见组合缺一不可:
-
none:允许用户直接输入图片地址、书签访问、PWA 离线加载等无 Referer 场景 -
blocked:接受被隐私插件、企业网关或 HTTPS→HTTP 跳转清空 Referer 后的请求 -
yourdomain.com和*.yourdomain.com:主域名和子域名都要显式列出(通配符不自动包含主域) -
https://partner-site.com:添加可信合作方域名,多个用空格分隔 - 若使用 CDN,把 CDN 域名(如
cdn.yourdomain.com)也加进白名单
拦截动作要明确且安全
判断 $invalid_referer 为真后,选择一种响应方式:
-
return 403;:最简洁,适合技术型站点或对盗链零容忍的资源 -
rewrite ^(.*)$ /images/forbidden.png break;:返回一张提示图,需确保该图路径不匹配当前防盗链规则(比如单独放在/public/下并放行) - 避免用
return 302或redirect,会暴露真实路径,还多一次跳转
别踩这几个典型坑
很多配置看似正确却无效,问题常出在细节:
-
valid_referers写在http或server块顶层——它只在server或location内生效 - 漏掉
none或blocked,导致自家页面在 HTTPS 页面引用 HTTP 图片时返回 403 -
if块写在try_files或alias之后——Nginx 会先查文件,找不到就直接 404,根本不会执行if - 用
alias时末尾没加斜杠,造成路径拼接错误,返回 404 而非预期的 403


















