Nginx防盗链规则保护产品原图防止盗用
产品原图被别的网站直接引用,最直接的后果是服务器流量被白白消耗,图片版权也说不清。Nginx 防盗链规则是通过检查访问请求中的 Referer 字段来实现的,只允许自家域名和约定的空 Referer 访问图片,其余来源一律返回 403。
本文面向零基础用户,从原理讲到配置,再给出验证方式和常见坑点,你只需跟着操作就能完成基础防护。
防盗链规则到底做了什么
当浏览器访问一张图片时,HTTP 请求头里通常会带一个 Referer 字段,表示“我是从哪个页面跳过来的”。
如果这个页面是别人的网站,那这张图片就是在被跨站引用。
Nginx 的 valid_referers 指令可以定义一份允许的来源白名单,不在名单里的请求就会触发你设定的 deny 动作。
对于产品原图这类资源,防盗链的意义不只是省流量,还能避免图片被嵌入到别人的页面里展示,减少被批量采集和冒用的风险。
配置前要确认哪些事
开始之前,先做好两件事:
- 确认你的网站是用 Nginx 跑的,而不是 Apache。可以在服务器执行
nginx -v查看版本;如果你用的是宝塔面板,在“软件商店”里能看到 Nginx 的运行状态。 - 确认你要保护哪些目录或文件类型。常见做法是保护
uploads、images、static这类存放图片的目录,或者专门针对.jpg、.png、.gif、.webp等图片后缀做限制。
另外,CDN 加速和防盗链可能冲突,如果网站接了 CDN,需要先确认 CDN 回源时是否带 Referer,否则可能会误伤正常访问。
手把手配置 Nginx 防盗链规则
Nginx 防盗链规则通常写在 server 块或 location 块里,推荐针对具体图片目录配置,避免影响整站。
通过宝塔面板配置(适合新手)
- 登录宝塔面板,进入“网站”,找到目标站点,点击“配置文件”。
- 在
server { ... }内部,找到你想保护的目录对应的location块,或者直接在server块里新增一段。 - 参考下面的配置,按需修改域名和目录:
location ~* /\.(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
if ($invalid_referer) {
return 403;
}
expires 30d;
access_log off;
}
none表示允许空 Referer 访问,比如直接在浏览器地址栏输入图片链接,或者某些 App 内打开时没有 Referer。blocked表示允许被防火墙或代理隐藏了 Referer 的请求。server_names代表下面列出的域名都是合法来源。*.yourdomain.com覆盖所有子域名,yourdomain.com覆盖主域名,请替换成你自己的域名。return 403是拒绝访问,你也可以改成rewrite一张防盗链提示图。
保存后,在 Nginx 设置里点击“重载配置”。
建议先用 nginx -t 检查语法,再执行 systemctl reload nginx 或 nginx -s reload。
手动修改 Nginx 配置文件(适合命令行用户)
如果你不用面板,直接用 SSH 登录服务器:
# 编辑站点配置文件,路径根据实际情况调整
vim /etc/nginx/conf.d/yourdomain.conf
在 server 块里加入类似下面的配置,这种写法只保护指定目录里的图片,对站点其他部分无影响:
location /uploads/ {
alias /path/to/uploads/;
valid_referers none blocked *.yourdomain.com yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
保存后执行:
nginx -t
systemctl reload nginx
看到 syntax is ok 就说明配置语法没问题。
配置完怎么验证是否生效
不要只看配置就收工,一定要实际测试。
下面三种验证方式,任选一种即可:
- 正常页面访问:用浏览器打开你网站的某个产品详情页,图片应正常显示。打开浏览器开发者工具(F12),在 Network 里查看图片请求状态,应为 200。
- 伪造来源访问:在命令行用 curl 模拟一个陌生网站的 Referer:
curl -I -e "http://evil.com/page.html" "https://yourdomain.com/uploads/product.jpg"
如果返回 403 Forbidden,说明规则已经拦截了盗链请求。
- 无 Referer 访问:直接访问图片 URL,不带 Referer:
curl -I "https://yourdomain.com/uploads/product.jpg"
如果返回 200,说明 none 设置生效;
如果返回 403,说明你在配置里没加 none,可以按需调整。
高频出错点和避坑说明
1. 二级域名被误杀
如果图片被二级域名正常引用,但显示 403,检查 valid_referers 是否写上了对应的 *.yourdomain.com。
子域名和主域名最好都写,否则很容易漏。
2. 空 Referer 被拦截
很多用户直接在微信、QQ 或浏览器地址栏打开图片链接,此时 Referer 为空。
若你的 valid_referers 里没有 none,这些请求会被拦掉。
建议保留 none。
但如果你的需求是防止别人在自家服务器上下载原图,也可以去掉 none,根据业务取舍。
3. 使用 if 指令的注意事项
Nginx 官方文档不建议在 location 中随意使用 if,但 if ($invalid_referer) 是常见用法,实践中非常普遍。
更稳妥的写法是使用 map 或 referer_hash,但对大多数中小企业站点,if 足够用。
4. 防盗链不是绝对安全
Referer 可以伪造,防盗链规则只能防“普通盗用”,防不住刻意学你 Referer 的脚本。
如果产品原图极其敏感,建议同时使用水印、权限控制或带签名的 URL(比如 Nginx secure_link 模块)。
5. 用了 CDN 要小心回源请求
CDN 节点回源时,Referer 可能是 CDN 的域名,也可能为空。
如果配置后 CDN 图片全部 403,建议在 CDN 控制台设置回源 Host,并在 Nginx 的 valid_referers 里加入 CDN 域名,或直接关闭部分路径的防盗链。
常见问题解答
问:配置了防盗链后,自己网站上的图片也打不开怎么办?
先检查 valid_referers 填的域名是否和你网站当前访问域名完全一致,包括协议、端口。
如果用了 HTTPS,但配置里是 HTTP,也会拦截。
再确认是否写了 none,没有的话直接在浏览器输入图片链接访问也会失败。
问:只想保护产品原图,不限制其他图片怎么弄?
把图片按目录区分,比如产品原图放在 /uploads/product/,然后给这个目录单独写 location,其他目录不写规则即可。
不要对全站图片做统一限制,否则容易影响样式或轮播图。
问:Nginx 防盗链和 CDN 防盗链选哪个?
如果只靠 Nginx 防盗链,CDN 缓存的是原始图片,别人拿 CDN 地址也能直接访问。
建议使用 CDN 自带的 Referer 黑白名单或鉴权功能,在边缘节点就拦截盗链,这样节省的回源流量更多。
两者可以结合使用。
问:配置后 error.log 里大量 403,会影响网站收录吗?
403 响应本身是正常的拦截结果,不会被误判为网站故障。
但如果你把首页、JS、CSS 这些也加入了图片防盗链规则,且没放行相关来源,可能导致页面资源加载失败,从而影响抓取。
所以仅针对图片路径配置,不建议全局乱写。
完成以上配置后,你的 Nginx 防盗链规则已经能覆盖大部分盗用场景。
如果后续出现图片批量采集或流量异常,建议再配合日志分析、限速模块以及对象存储的权限策略加固。
Nginx 防盗链规则保护产品原图防止盗用,本质上是给图片资源加一道简单的“门禁”,把非白名单来源挡在门外,既不改变原图结构,也不影响正常用户访问。
如果配置过程中遇到问题,优先回看自己的 valid_referers 域名和路径是否匹配,再检查是否有 CDN 或反代层干扰,多数异常都能从这里找到原因。