Nginx图片防盗链最有效方式是在server或location块中用valid_referers定义白名单并结合$invalid_referer拦截。应聚焦保护jpg、png等静态资源,避免全局配置;推荐正则匹配后缀或指定/img/路径;白名单支持none、blocked、server_names、子域名及合作方域名;拦截可返回403、重写提示图或跳转提示页;需验证Referer空值及App内访问兼容性。

直接在 Nginx 的 server 或 location 块中配置 Referer 白名单,是最常用、最有效的图片防盗链方式。核心是用 valid_referers 定义合法来源,再通过 $invalid_referer 变量拦截非法请求。
明确要保护的资源路径和类型
防盗链应聚焦在真实被盗风险高的资源上,比如图片、图标、字体等静态文件。不建议全局启用,避免误伤正常访问(如微信内嵌浏览器、书签直连等场景常无 Referer)。
- 推荐用正则匹配后缀,例如:
location ~* \.(jpg|jpeg|png|gif|webp|ico|svg)$ - 如果只保护
/img/目录下的图,可写成:location /img/ - 避免写
location /全局拦截,否则可能影响首页、JS、CSS 等关键资源加载
设置合法 Referer 白名单
valid_referers 指令定义哪些来源算“可信”。它支持多种模式,组合使用更稳妥:
- none:允许空 Referer(用户直接输入 URL、书签访问、部分 App 内浏览器)
- blocked:允许 Referer 被代理或防火墙屏蔽后的请求(值存在但不以 http:// 或 https:// 开头)
-
server_names:自动匹配当前
server_name域名(含 www 和非 www) -
*.example.com:允许所有子域名(注意星号需加引号或转义,实际配置中写
~\.example\.com$更安全) - https://trusted-site.com:显式添加合作方域名(支持多个,用空格分隔)
示例配置:
valid_referers none blocked server_names *.mydomain.com https://partner-site.com;
if ($invalid_referer) {
return 403;
}
}
选择合适的拦截响应方式
非法请求不必都返回 403,可根据业务需要灵活处理:
- return 403:最简洁,告诉客户端“禁止访问”,日志易排查,适合技术型站点
- rewrite ^/ /daolian.png break;:重写为一张提示图(需确保该图本身不被盗链,建议放在独立路径并关闭防盗链)
- return 302 https://mydomain.com/notice.html;:跳转到友好提示页(注意避免循环或跨域问题)
注意:rewrite 后加 break 表示内部重写,不改变浏览器地址栏;加 redirect 则是 302 外部跳转。
验证与调试要点
配置完成后必须验证,不能只看语法是否正确:
- 用
nginx -t检查配置语法,再nginx -s reload生效 - 在浏览器开发者工具 Network 标签中,手动修改图片请求的 Referer 头,测试是否被拦截
- 查看 Nginx access log,确认
$http_referer字段是否记录准确(需提前在 log_format 中加入) - 特别留意微信、QQ、钉钉等 App 内打开页面时 Referer 常为空或被截断,务必保留
none和blocked


















