Nginx 图片防盗链需精准匹配路径、合理配置白名单并明确拦截动作:用正则匹配图片后缀,location 内设 root/alias,valid_referers 包含 none、blocked 和域名,非法请求 return 403。

在 Nginx 中用 valid_referers 防止图片盗链,核心是只允许合法来源(比如你自己的网站、空 Referer、合作方)访问图片资源,其他一律拦截。关键不在“能不能拦”,而在“拦得准不准”——漏拦会耗带宽,误拦会让用户看不到图。
精准匹配图片资源路径
防盗链必须作用于真实被引用的图片文件,不能笼统配在根路径下。推荐用正则匹配常见后缀,覆盖主流格式且避免误伤:
-
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico)$—— 匹配大小写不敏感的所有图片请求 - 不要写
location /images/再靠内部判断,容易漏掉放在根目录或 CDN 回源的图片 - 该 location 块内必须有
root或alias,否则文件根本找不到,防盗链形同虚设
设置合理 Referer 白名单
白名单要覆盖真实合法访问场景,否则用户点开链接一片空白,会以为网站坏了:
-
none:允许直接输入 URL、收藏夹打开、微信内嵌浏览器等无 Referer 场景 -
blocked:覆盖 HTTPS 页面加载 HTTP 图片、某些代理/防火墙清空 Referer 的情况(必须保留) -
yourdomain.com www.yourdomain.com:显式列出主站和带 www 的域名(它们是两个不同字符串) -
*.yourdomain.com:允许所有子域名(如 blog.yourdomain.com、cdn.yourdomain.com) - 如需支持合作站点,可加
partner-site.com或正则~\.cdn\.(com|net)$
明确拦截非法请求
检测到非法 Referer 后,动作要清晰、可追踪、不影响正常逻辑:
- 最推荐:
if ($invalid_referer) { return 403; }—— 状态码语义明确,日志好查,CDN 和爬虫能正确识别 - 避免用
rewrite ... break跳转到提示图:状态码仍是 200,掩盖盗链行为,还可能因路径错乱导致循环或 404 - 如需友好提示,改用:
error_page 403 =200 /images/forbidden.png;—— 日志仍记 403,浏览器看到的是小图
避开几个高频坑
这些细节不处理,防盗链可能完全失效或大面积误拦:
- HTTPS 页面引用 HTTP 图片时,浏览器会主动清空 Referer,
blocked必须保留 - 用
alias时,路径末尾斜杠要和location一致(如location /img/ { alias /data/images/; }) -
valid_referers只能在server或location块里生效,不能写在http或upstream块中 - Referer 可被客户端伪造,所以它只防粗暴盗链,不防恶意爬虫;高敏资源建议配合签名 URL 或
internal指令


















