图片做CDN加速时,只要在CDN或对象存储控制台开启“回源跟随”,并让节点缓存重定向后的最终图片内容,就能从根源上避免同一张图片产生两次甚至多次回源请求。
图片回源跟随怎么设置:先看懂重复回源的链条
当用户请求一张图片,CDN节点没有缓存时,会向源站发起回源,如果源站返回302或301跳转,节点可能把这个跳转原样交给浏览器,浏览器再向跳转后的地址发请求,如果跳转地址没有走CDN,或者CDN不识别,就形成一次额外回源,更糟的是这种跳转可能发生在每一次缓存未命中时,源站反复被敲打。
开启回源跟随后,节点自己顺着Location去取图片,取到手后缓存下来,浏览器只收到最终图片,不参与二次跳转,这个动作在控制台里通常叫“回源跟随”或“重定向跟随”。
CDN回源跟随302和301怎么配
主流CDN控制台路径大致相同:
- 简米云CDN:域名管理 → 选中域名 → 回源配置 → 回源跟随,打开开关,勾选“跟随301/302”,最大跟随次数默认3次。
- 酷番云CDN:域名管理 → 回源配置 → 回源跟随,开启后同样支持301/302。
- 七牛云CDN:进入域名配置 → 回源配置 → 开启“回源重定向跟随”。
配置时注意两点:
- 最大跟随次数别设太大,源站若出现循环重定向,节点会跟着转圈,浪费回源资源。
- 重定向后的Host和Referer要按需透传,否则源站可能拒绝请求。
对象存储图片回源重复请求从哪里来
很多图床用对象存储加CDN,源站是OSS或COS,图片可能通过镜像回源、样式处理、或者鉴权签名,这些场景里,源站经常返回302到另一个存储桶或处理后的地址。
- 图片原始地址带签名,签名过期后源站返回302到新签名地址。
- 图片处理服务先返回302到处理结果。
- 镜像回源源站A没有文件,302到源站B。
如果CDN不跟随,浏览器每次都要自己跳转,跳转后的地址往往直连对象存储,绕过CDN加速,产生额外回源流量,开启回源跟随后,CDN节点把302后的图片拉回本地缓存,后续请求直接命中。
业内专家指出,回源跟随配置的收益在源站大量使用302跳转的场景里最明显。
图片回源跟随对比:不开启的代价有多大
用一个具体场景说明,某图床自定义域名开启CDN,源站对图片URL做302跳转到OSS直连地址,未开启回源跟随时,用户请求一张新图片:
- 浏览器 → CDN节点:请求图片
- CDN节点 → 源站:回源请求图片
- 源站 → CDN节点:返回302跳转
- CDN节点 → 浏览器:返回302跳转
- 浏览器 → OSS直连地址:再次请求图片
- OSS返回图片
同一张图片产生了两次回源:一次到源站,一次到OSS直连,开启回源跟随后,第二条路径变成CDN节点直接去OSS拉取,第三步后节点缓存图片,浏览器只收到200和图片内容,后续请求无论原始URL是否302,都命中CDN缓存,不再回源。
图片加载慢回源跟随怎么排查
如果你发现图片加载慢,怀疑是回源重定向导致,先用curl看响应头:
curl -I https://你的图片域名/路径.jpg
如果返回HTTP/2 302和Location: https://oss.example.com/...,说明源站在跳转,再执行:
curl -L -I https://你的图片域名/路径.jpg
对比是否返回200和x-cache: HIT,如果没有HIT,或者每次都回源,就去控制台检查回源跟随是否开启,观察浏览器开发者工具里的网络面板,如果同一张图片出现两条请求记录,且第一条是302,第二条是跨域或直连源站,基本可以确认重复回源。
国内CDN图片回源跟随配置对比
不同服务商对回源跟随的支持细节不一样,整理如下:
| 服务商 | 配置入口 | 跟随状态码 | 默认状态 | 循环防护 |
|---|---|---|---|---|
| 简米云CDN | 回源配置-回源跟随 | 301/302 | 关闭 | 最大3次 |
| 酷番云CDN | 回源配置-回源跟随 | 301/302 | 关闭 | 可自定义 |
| 七牛云CDN | 域名配置-回源配置 | 301/302/307 | 视套餐 | 支持 |
按量计费时,回源流量通常单独计费,行业共识认为,开启回源跟随带来的回源流量增加,多数情况下会小于客户端绕过CDN直连源站造成的流量成本。
实操中容易踩的三个坑
缓存Key和重定向后的资源对不上
CDN开启回源跟随后,节点缓存的是重定向后的最终图片,但缓存Key默认还是原始请求URL,如果重定向后的URL里带了动态参数,比如签名或时间戳,每次回源得到的Location不同,节点可能无法复用缓存,解决办法:在CDN缓存配置里,把重定向后的URL标准化,去掉易变参数,或者将缓存Key设置为原始URL,但忽略重定向参数的影响,具体操作路径:CDN控制台 → 缓存配置 → 自定义缓存Key → 去除指定参数。
死循环重定向防护
如果源站图片A重定向到图片B,图片B又重定向回图片A,节点跟随次数耗尽后返回错误,开启回源跟随后,建议把最大跟随次数设为2或3,主流CDN默认就是3次,不要设成10次,那样会放大循环伤害。
源站防盗链导致跟随失败
有些源站配置了防盗链,只允许特定Referer或签名访问,CDN节点跟随重定向时,如果Referer被改写成节点地址,源站可能拒绝,解决方法是:在回源配置里显式设置回源Host为源站域名,并在回源请求头里透传原始Referer,以简米云CDN为例,路径是:回源配置 → 回源HTTP请求头 → 添加自定义回源头Referer: $http_referer。
回源Host与重定向Location的域名不一致
如果源站返回的Location域名和回源Host不一致,节点跟随过去可能拿不到资源,例如源站返回Location: https://img-internal.example.com/xxx.jpg,而这个内部域名只在源站内网解析,这种情况需要在源站侧把重定向目标改成公网可访问的域名,或者在CDN配置里把回源Host设置为重定向目标的域名,检查命令:
curl -I https://你的图片域名/路径.jpg | grep Location
看返回的域名是否可公网解析。
图片回源跟随开启后的缓存刷新配合
开启回源跟随只是第一步,如果源站重定向目标发生变化,比如图片从A桶迁移到B桶,而CDN节点还缓存着旧内容,就会出现图片更新不及时,这时需要手动刷新CDN缓存:
- 简米云CDN:刷新预热 → 提交URL刷新,输入图片完整URL。
- 酷番云CDN:刷新预热 → URL刷新。
- 七牛云CDN:刷新预取 → 提交刷新。
刷新后,节点会丢弃旧缓存,重新回源并跟随新的重定向目标,如果图片数量很多,可以用目录刷新,但注意目录刷新会同时刷掉所有关联资源,对于图片场景,通常按具体URL刷新更精准。
开启回源跟随不是万能药,但它是处理图片302/301重复回源最直接、成本最低的配置,只要把最大跟随次数、缓存Key规则和回源请求头这三个细节一起调对,源站被重复敲打的情况就能基本消除。
Q&A:关于图片回源跟随怎么设置的三个疑问
图片回源跟随开启后,缓存命中率会不会下降?
不会反向下降,正确配置下,节点缓存的是重定向后的最终图片内容,缓存Key仍由原始请求URL决定,只要重定向目标稳定,命中率会提升,如果目标带有动态参数,需要先在缓存Key配置里过滤参数,否则可能降低命中。
CDN回源跟随302会影响图片加载慢吗?
通常不会,反而会改善,浏览器少了一次手动跳转,节点直接取回最终资源并缓存,只有在跟随过程中源站响应极慢或循环重定向时,首包时间才会变长,遇到这种情况,限制最大跟随次数就能控制。
如何排查对象存储图片回源重复请求?
先开启CDN访问日志,筛选返回码为302或301的图片请求,再用curl带上-I查看响应头,确认Location指向源站之外的地址,最后检查CDN控制台回源跟随开关是否开启,以及源站是否把重定向响应缓存了,如果源站返回的302响应被CDN缓存,也会导致客户端反复跳转,这时需要在源站设置Cache-Control: no-cache或不缓存302状态码,多数情况下,关闭源站对302的缓存,并打开CDN回源跟随,重复回源就会消失。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/644286.html





