nginx图片防盗链需通过valid_referers精准设置白名单并配合$invalid_referer拦截,支持none以兼容微信等空referer场景,按路径分级控制策略,并注意referer可伪造及cdn透传问题。

在 Nginx 中为图片服务器配置防盗链,核心是通过 valid_referers 指令识别合法来源,并对非法请求返回错误或重定向。重点不是“禁止所有外链”,而是精准放行可信域名,同时拦截恶意盗用。
1. 基础防盗链配置(只允许指定网站引用)
在图片服务器的 server 或 location 块中添加:
- 使用
valid_referers定义白名单:支持域名、正则、none(直接访问)、blocked(被防火墙修改过的 referer) - 用
if ($invalid_referer)判断并拦截:可返回 403、跳转到提示图,或直接返回空响应
示例(只允许本站和合作站点访问):
location ~* \.(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked server_names
*.example.com
*.partner-site.com;
if ($invalid_referer) {
# 返回 403 禁止访问
return 403;
# 或者返回一张“禁止盗链”图片(需确保该图本身不被防盗链)
# rewrite ^/.*$ /images/hotlink-denied.png break;
}
}
2. 允许空 Referer(支持书签、微信内直接打开等场景)
很多用户从微信、钉钉、邮件点击图片链接时 referer 为空,若完全禁用 none 会导致误拦:
-
valid_referers none表示接受无 referer 的请求(如直接输入 URL、APP 内打开) - 建议保留
none,除非你明确要求所有访问必须带来源 - 注意:搜索引擎图片搜索通常带 referer,但部分移动端环境可能被清空
3. 配合图片路径做精细化控制
不是所有图片都需要同样严格保护。可按目录或前缀区分策略:
- 公开图库(如
/public/下):不启用防盗链 - 用户上传图(如
/upload/):启用严格 referer 白名单 - 水印图或缩略图(如
/thumb/):可统一重写为带水印原图,避免被绕过
示例:
location ^~ /upload/ {
valid_referers none server_names *.example.com;
if ($invalid_referer) {
return 403;
}
}
<p>location ^~ /public/ {</p><h1>不加防盗链,或仅限 basic auth</h1><p>}</p>4. 注意事项与常见坑
- Referer 可伪造:防盗链只是基础防护,不能替代鉴权;敏感资源请配合 token 或后端校验
- 不要对 CSS/JS 启用防盗链:可能导致页面样式错乱(它们也属于“引用资源”)
-
测试时用 curl 模拟 referer:
curl -H "Referer: https://bad-site.com" https://img.example.com/test.jpg - CDN 场景下注意 referer 是否被透传:部分 CDN 默认不传递 referer,需开启「透传 Referer」或改用 CDN 自带防盗链功能











