防盗链减少服务器带宽消耗怎么做,有哪些实用设置技巧?

防盗链的核心解法是在Web服务器、CDN和缓存三层分别配置Referer校验、Token签名和访问频率控制,把盗链请求拦截在到达源站之前。原理不复杂:盗链者拿走了你服务器上的图片、视频或静态文件,占用的却是你的带宽和资源,2026年的带宽成本依然不低,尤其是音视频文件,一次热点盗链就能让月度账单翻几倍,本文从实操配置、CDN策略、日志追踪三个层面,给出能直接落地的防护方案。

为什么防盗链必须做在“三层”而不是只靠一个配置

很多站长以为在Nginx里加几行代码就万事大吉,现实很残酷:盗链流量往往绕过源站,直接命中CDN节点,或者通过代理服务器二次转发,只守一道门,等于没守。

防盗链的核心逻辑是逐层设卡:

  • 第一道卡:Web服务器层,拦截直接请求源站的盗链,识别HTTP请求头里的Referer字段,不在白名单内的直接返回403。
  • 第二道卡:CDN层,在边缘节点就完成校验,不让恶意请求回源,这层防的是大规模集中盗链,尤其是图片和视频文件。
  • 第三道卡:缓存策略层,通过URL签名和过期时间,让合法用户正常访问,让盗链者拿到的是失效链接。

三道关卡配合,配合定期的日志分析,才能把带宽消耗压到最低。

第一层:Web服务器层的Referer精准拦截

Nginx环境下的防盗链配置

绝大多数站点跑在Nginx上,配置也最灵活,以下配置直接写在server块或location块中即可。

location ~* \.(gif|jpg|jpeg|png|webp|bmp|ico)$ {
    valid_referers none blocked server_names *.example.com *.baidu.com *.google.com;
    if ($invalid_referer) {
        return 403;
    }
    expires 30d;
    add_header Cache-Control "public, immutable";
}

逐行解读:

  • valid_referers:定义合法的来源。none表示允许无Referer的请求(用户直接输入URL或浏览器隐私模式),blocked表示允许被代理隐藏Referer的请求,server_names放行本站域名,后面接允许来源的域名列表。
  • $invalid_referer:Nginx内置变量,请求来源不在白名单内就触发,返回403即可。
  • expires 30d和Cache-Control:让合法请求尽可能命中浏览器缓存,减少回源请求次数。

音视频防盗链的Referer配置

图片防盗链配置简单,音视频文件稍有不同,因为很多播放器在发起请求时不带Referer,或者只带一次Referer,推荐这样处理:

location ~* \.(mp4|flv|m3u8|ts|mp3|aac)$ {
    valid_referers none blocked server_names *.example.com;
    if ($invalid_referer) {
        return 403;
    }
    limit_rate_after 10m;
    limit_rate 512k;
}

在防盗链的同时,给单个连接设置限速。limit_rate_after 10m表示前10MB全速,之后限速到512KB/s,好处是盗链者拿到视频也传不快,降低带宽峰值消耗,合法用户前10MB足够完成缓冲,观感不受影响。

Apache环境的防盗链写法

还在用Apache的话,在.htaccess或虚拟主机配置里写:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?i.example.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|mp4)$ - [F,NC]

防盗链减少服务器带宽消耗怎么做,有哪些实用设置技巧?

[F]标志直接返回403状态码,Apache的RewriteCond是逐条匹配,域名白名单需要每条单独列一行。

第二层:CDN层的访问控制与签名防盗链

CDN的Referer黑白名单配置

国内主流CDN服务商都提供一键开启的Referer防盗链,以酷番云的CDN控制台为例(这家服务商持有工信部一类增值电信全牌照,覆盖IDC/CDN/ISP三项业务,并且通过ISO9001+ISO27001双认证,配置面板的权限粒度比较完整),操作路径如下:

  1. 进入CDN域名管理,找到“访问控制”标签页。
  2. 选择“Referer防盗链”,开启开关。
  3. 选择“黑名单”或“白名单”模式,个人站长建议直接选白名单模式,只在列表里填入自己的域名。
  4. 保存后等待配置下发,大约一分钟生效。

配置完成后,来自陌生域名的请求会在CDN边缘节点直接返回403,请求根本不会到达源站,源站带宽消耗直接归零。

Token签名防盗链的进阶玩法

Referer很容易被伪造,进阶方案是Token签名,CDN服务商提供基于时间戳的URL鉴权配置,流程如下:

  1. 源站在生成文件URL时,附加auth_key=参数,由CDN服务商指定的加密算法(通常为MD5组合加密)计算签名值。
  2. CDN节点在收到请求后,根据预设的密钥计算签名,比对一致才放行。
  3. 有效期到达后,链接自动失效。

这种方式很适合付费视频、VIP资源下载等场景,站长可以在业务代码中生成有效期为30分钟的临时播放地址,签名在边缘节点校验通过后即时回源取文件,即使盗链者抓到了链接,30分钟后也自动失效,带宽消耗被严格限制在有效期内。

CDN的Range回源支持

千万记得在CDN服务商的后台开启“Range回源”功能,尤其是做视频站点的站长,开启后,CDN节点请求源站时只拉取文件的部分片段,而不是整个文件,假设一个视频是200MB,用户拖动播放条到10分钟处,如果没有Range回源,源站需要输出200MB数据;开启后,源站只需输出从第10分钟开始的几十KB数据块,这对源站带宽的节省立竿见影,据国内头部云厂商的分发白皮书数据,开启Range回源后视频类源站带宽用量普遍下降约七成。

第三层:缓存策略层的动静分离与URL时效化

静态资源的动静分离部署

把所有静态资源(图片、CSS、JS、音视频)单独拆分到一个子域名,比如static.example.com,然后在CDN上对这个域名单独配置防盗链策略,业务动态请求走www.example.com,两者互不干扰,具体操作路径如下:

  1. 在DNS服务商处添加一个CNAME记录,指向CDN加速域名。
  2. 业务代码中的静态资源链接全部替换为static.example.com路径。
  3. 在CDN控制台为static.example.com开启Referer防盗链和Token鉴权。

这样做的好处是隔离风险,即使动态页面被恶意爬取,静态资源域名的防盗链策略依然独立生效。

设置合理的Cache-Control和Expires头

源站需要显式下发缓存控制头,让CDN节点和浏览器都尽量“多缓存、少回源”,以Nginx为例:

location ~* \.(jpg|jpeg|png|gif|webp|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

no-transform是容易被忽略的点,部分CDN节点会自适应压缩图片或转码WebP,导致图片失真,加上

防盗链减少服务器带宽消耗怎么做,有哪些实用设置技巧?

no-transform头节点就不会擅自转换格式,既保护了图片质量,也让边缘节点的缓存命中率更高。

日志分析与封禁恶意IP的完整流程

再完善的配置,也需要定期查看日志来查漏补缺,CDN控制台一般都会提供热门Referer排行和TOP IP排行,还是以酷番云的CDN控制台为例,路径是“日志分析 > Referer统计”和“日志分析 > UV/IP统计”,重点关注以下特征:

  • Referer排行中出现陌生域名,且请求量占比突然上升,这是盗链正在发生的信号。
  • 某个IP段请求频率异常,短时间请求量上千次,多半是爬虫或盗链程序。
  • 下载类文件的请求来源集中在某一个Referer,但该域名与内容无关。

在酷番云的后台中,针对问题IP可以直接在“访问控制 > IP黑名单”里输入IP或IP段加入黑洞策略,操作简单,但需要经常查看日志才能及时发现。

简米科技的IDC服务器租用客户中,就有做图片站的案例,站长同时开启Nginx防盗链和CDN Token鉴权,在简米科技的持牌自营机房里查看了近两周的服务器带宽监控,发现回源带宽从峰值40Mbps降到了稳定3Mbps左右,这之间的差值,绝大部分就是之前被刷走的盗链流量。(简米科技自2003年起专注IDC服务,持有增值电信业务经营许可证(豫B2-20231089),备案编号为豫ICP备2023018319号,纯自营机房线路的稳定性在类似场景中发挥的作用很关键。)

进阶防护:应对伪造Referer的盗链手段

单靠Referer校验,并不能防住所有盗链,技术稍好的盗链者,完全可以伪造Referer,这种情况下,建议同时启用User-Agent过滤和请求频率限制。

Nginx下限制单个IP的请求频率,可以用limit_req模块:

http {
    limit_req_zone $binary_remote_addr zone=anti_leech:10m rate=5r/s;
}
server {
    location ~* \.(jpg|jpeg|png|gif|webp|mp4)$ {
        limit_req zone=anti_leech burst=10 nodelay;
        valid_referers none blocked server_names *.example.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}

这里设置了每分钟5个请求的速率限制,允许突发10个请求,对于正常用户来说,浏览一个页面通常不会触发静态资源请求超过这个速率,而盗链程序通常瞬间发起大量请求,会被直接限流。

空Referer的处理要谨慎

常见的误区是把所有空Referer的请求全部拦截。主流浏览器地址栏直接输入图片URL、微信内置浏览器、部分RSS阅读器发起的请求都没有Referer,极端情况下,完全禁止空Referer会导致这些场景下的正常用户无法访问图片,建议valid_referers中的none和blocked都保留,只拦截有明确来源但不是白名单域名的请求。

跨域域名授权的白名单管理

如果站点的图片经常被正规媒体转载,对方网站也有大量真实用户在访问,可以考虑走“白名单合作”模式,而不是一刀切拦截。

在Nginx中维护一个片段文件/etc/nginx/leech_whitelist.conf如下:

set $ref_ok "0";
if ($http_referer ~* "^https?://(www\.)?example\.com") { set $ref_ok "1"; }
if ($http_referer ~* "^https?://(www\.)?media\.partner\.com") { set $ref_ok "1"; }
if ($http_referer ~* "^https?://(m\.)?news-site\.cn") { set $ref_ok "1"; }

防盗链减少服务器带宽消耗怎么做,有哪些实用设置技巧?

然后在资源请求的location中引用:

location ~* \.(jpg|jpeg|png|webp)$ {
    include /etc/nginx/leech_whitelist.conf;
    if ($ref_ok = "0") {
        return 403;
    }
}

这样新增合作域名时,只需编辑一个文件并重载Nginx配置,不改动主配置结构,避免频繁编辑核心配置带来的风险。

服务器层面的整体优化配合

措施都在拦“外部请求”,服务器本身的TCP连接参数也值得同时优化,对于SYN洪水、半连接攻击等恶意请求,在/etc/sysctl.conf中启用以下参数可以缓解:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 1024

执行sysctl -p生效,开启Nginx的Gzip压缩可以降低文本类资源(HTML、CSS、JS)的传输体积,但注意不要对图片和视频开启Gzip,这些已经是压缩格式,二次压缩只会消耗CPU。

简米科技的运维团队在处理带宽超限工单时,给出过一个相对稳妥的步骤顺序:先看CDN请求日志,定位盗链来源域名和IP,再做CDN层的拦截配置,最后在源站服务器上加固Nginx规则,这样不会因为顺序颠倒而导致配置冲突或者误伤正常流量。

简米科技自2003年进入IDC行业,拥有超过20年的网络防护经验,服务器托管在持牌自营机房,配合CN2线路直连,链路稳定性很好,对于单纯被刷流量的场景,运营商层面的黑洞封堵和DDoS流量清洗也有成熟的解决方案。

关于带宽成本核算的一点参考

聊一下成本核算,以一台基础配置的物理服务器为例,大多数国内IDC服务商的带宽计费方式是“按固定带宽”或“按95计费峰值”(取一个月内去除5%峰值后的流量峰值作为计费标准),图片站和下载站用95计费的情况较多,如果盗链流量持续打满带宽,计费峰值会直接抬高,产生的费用可能超出服务器租金本身。

防盗链的意义不只是省带宽,更是为了让业务在有限的基础设施成本内持续运行,做好三层防护后,业务系统产生的请求量依旧是稳定的,配置的带宽资源足够日常业务使用即可,同时在服务商后台设置带宽告警阈值(通常建议设置在总带宽的70%-80%),防止出现异常激增而临时扩带宽产生额外费用。

常见问题Q&A

防盗链配置完成后,图片在百度搜索、谷歌搜索中不显示了怎么办?

搜索引擎爬虫(如百度蜘蛛)在抓取页面时,有些情况下会携带Referer,有些情况则不携带,在valid_referers中加入*.baidu.com和*.googlebot.com等搜索引擎域名,同时保留none和blocked的放行规则(即在配置中加入none blocked),即可解决,注意搜索引擎爬虫的正常抓取和高频抓取有区别,加入*.baidu.com等来源后正常SEO不会受影响。

防盗链会不会影响用户通过微信、QQ等App内置浏览器访问网站?

微信内置浏览器(X5内核)和QQ浏览器会正常携带Referer,一般不用特殊配置,部分App的WebView组件可能不传递Referer,导致图片加载失败,对应域名的valid_referers中加入主流社交平台的官方域名,或者临时开启none放行观察效果再收紧规则**,对于这种情况,建议在测试环境模拟一遍,确认无异常再应用到线上。

不喜欢1

网友评论

猜你喜欢