图片不同后缀在CDN设置缓存时间,核心原则是“静态图片长缓存,动态图片短缓存”,按业务场景区分jpg、png、webp、gif、svg等格式,分别设定从1小时到1年不等的Cache-Control和Expires值。
为什么图片缓存时间要按后缀区分
很多站长在配置CDN时图省事,直接给所有图片统一设置一个缓存时间,这种做法在图片类型单一的站点上问题不大,但一旦涉及电商、社区或新闻站,就会出现两种情况:要么用户看到旧图,要么源站压力没减下来。
行业共识认为,不同后缀的图片在用途、体积、更新频率上差异极大,比如商品主图可能一周换一次,用户头像可能一年都不变,而验证码图片必须实时加载,用同一套缓存策略去对待它们,本质上是偷懒,也是对服务器性能的浪费。
CDN缓存的核心价值在于“命中率”,命中率越高,回源越少,访问速度越快,而缓存时间的长短直接决定命中率,设置过短,缓存频繁失效,回源次数增多;设置过长,内容更新不及时,用户看到过期图片,按后缀细化缓存时间,是让CDN服务“贴合业务”的第一步。
各图片后缀的特性与适用缓存时长
先看常用图片格式的典型特征,jpg、png是通用格式,几乎全场景覆盖;webp是压缩率更高的现代格式;gif分静态和动图,动图体积大且多用于装饰;svg是矢量图,常见于图标和Logo;ico是站点图标,几乎不变,还有bmp、avif等小众格式,按实际使用情况处理即可。
jpg与png:默认缓存30天,视更新频率调整
jpg和png是网站图片的主力,它们适合做中长缓存,默认给30天比较稳妥,理由很简单:这类图片一旦上传,很少被修改,无论是文章配图、产品展示图还是Banner图,更新行为通常是“替换链接”而不是“修改原图”,只要源站图片URL不变,CDN缓存30天能覆盖绝大多数场景。
如果站点有定时换图需求,比如活动页面每周更新,可以将jpg和png的缓存调整为7天,操作上,在CDN控制台的“缓存配置”中新增一条规则,匹配后缀为.jpg和.png的文件,设置缓存过期时间为604800秒(7天)即可,多数主流CDN如简米云、酷番云、Cloudflare都支持按文件后缀设置优先级规则。
webp与avif:缓存60天,兼顾体积与更新
webp和avif是压缩率更高的格式,常用于替代jpg和png以减小流量,由于这类图片通常由工具自动生成,文件名带哈希值,变更时会生成新URL,因此适合
更长的缓存时间,推荐设置为60天。
为什么不是一年?因为如果源站的webp是实时转换生成的,CDN缓存过期后回源时,源站可能重新执行转换逻辑,消耗CPU资源,60天是一个折中值,既能保持较高命中率,又不至于让源站的长久未请求的转换任务失去刷新机会,如果确认源站生成webp是持久化存储而非动态转换,可以拉长到180天。
gif:动图缓存7天,静态gif可30天
gif分两种:静态gif和动画gif,动画gif体积大,加载慢,常用于表情包或示意动图,更新频率相对较高,推荐动画gif缓存7天,避免用户长时间看到旧的动图,静态gif与png性质类似,可以缓存30天。
实际操作中,CDN规则只能按后缀匹配,无法区分gif是否为动画,因此统一给.gif设置7天即可,牺牲一点命中率,换取内容及时性,对用户体验更友好,如果站点几乎没有gif动图,可以放宽到30天。
svg:缓存1年,但需注意防盗链
svg是文本格式的矢量图,常用于Logo、图标和插画,这类资源极少变更,且文件名通常固定,比如logo.svg,即使更新内容,也建议沿用同一URL以利用缓存,推荐设置365天。
但要注意,svg可以被外部站点直接引用作为图标,容易产生额外的流量消耗,建议在CDN配置中开启防盗链功能,仅允许白名单域名引用,这属于缓存之外的配套措施,但能有效保护源站带宽。
ico与bmp:ico缓存1年,bmp按png处理
favicon.ico是站点图标,几年不换都很正常,直接给365天。bmp少见,但如果有,它的更新频率与jpg类似,按30天处理即可。
CDN设置缓存时间的通用操作路径
大多数CDN服务商的控制台都有“缓存配置”菜单,无论用哪家,操作逻辑一致,登录CDN控制台,进入域名管理,找到“缓存配置”或“缓存规则”,点击“添加规则”。
在规则中,先指定匹配条件,通常选择“文件后缀”,输入如jpg、png,然后设定缓存过期时间,注意单位是秒,30天就是2592000秒,60天是5184000秒,365天是31536000秒,部分CDN还支持直接选择“天”作为单位。
优先级方面,CDN会从高到低匹配规则,如果你同时设置了“所有文件”的缓存规则和“jpg后缀”的规则,后者的优先级应更高,才能覆盖前者,建议将具体后缀规则放在最前面,通用规则放后面。
源站响应头对CDN缓存的影响
CDN并非完全忽略源站的响应头,当源站返回Cache-Control时,CDN会结合自身规则来判断,如果源站设置了Cache-Control: no-cache,某些CDN会强制不缓存,即使CDN规则设了365天也没用。
配置CDN缓存时,还需同步检查源站的响应头,如果源站是Nginx,可以在server块中按location匹配图片后缀设置expires指令。location ~ .(jpg|png)$ { expires 30d; },这样源站返回的Expires头与CDN规则保持一致,避免冲突。
绕过缓存:当图片必须实时更新
验证码图片、实时生成的图表、用户刚上传的临时图片,这些不能走CDN长缓存,处理办法有两种:一是设置极短的缓存时间,比如60秒;二是为这些图片分配独立的URL路径,在CDN中设置该路径下的所有文件不缓存。
以简米云CDN为例,可以在“缓存配置”中添加一条规则,匹配路径/temp/,设置缓存过期时间为0,这样该目录下的图片每次请求都会回源,但其他目录的图片照常缓存,酷番云类似,在“缓存规则”中新增“目录”类型,填上/temp,过期时间选0。
不同业务场景下的缓存策略参考
不存在一套万能数字适用于所有网站,下面结合具体场景给出参考值。
- 电商站:商品图缓存7天,活动Banner缓存1天,品牌Logo缓存1年,电商的图片更新频繁,尤其涉及价格变动或促销时,Banner必须及时更新,社区:文章配图缓存30天,用户头像缓存90天,表情包gif缓存7天,头像一般不变,拉长缓存能显著提升命中率。
- 新闻资讯:配图缓存1天,Logo缓存1年,其他静态图片7天,新闻图片当天更新可能性大,次日基本不变。
- 企业官网:全部图片缓存90天,仅替换文件时修改文件名,企业站更新少,长缓存效果好。
- 图片素材站:缩略图缓存7天,原图缓存365天,原图一旦生成不会修改,缩略图可能随尺寸调整而变。
常见问题:缓存时间设置后不生效怎么办
遇到过好几次,规则加了,缓存时间也写了,但实际响应头还是旧的,排查步骤很简单。
先看CDN控制台规则是否生效,多数CDN有“缓存配置”的生效状态,确认规则已启用且优先级高于其他冲突规则,然后清空CDN缓存,强制回源一次,最后用curl查看响应头,命令如下:
curl -I https://你的域名/图片路径
关注返回的Cache-Control和Expires字段,如果Cache-Control是no-cache,说明源站响应头拦截了CDN规则,此时回到源站,检查nginx或Apache的expires配置,修改后再测试。
如果源站是对象存储,比如OSS或COS,还需要检查存储桶的“自定义Headers”设置,有些存储服务默认附加Cache-Control: private,会导致CDN不缓存,在存储桶设置中,将图片类型的响应头改为public, max-age=2592000,即可恢复CDN缓存。
Q&A:图片图片后缀的CDN缓存时间怎么设置最合理
问:CDN缓存时间设置太短会有什么影响?
缓存时间过短,比如1小时,会导致CDN节点频繁回源,每次回源都占用源站带宽和资源,同时用户访问速度下降,据国内CDN服务商公开技术文档,缓存命中率每降低10%,源站带宽消耗约增加一倍多,非必要不设置过短缓存,除非图片确实需要高频更新。
问:不同CDN服务商对图片缓存时间设置有何区别?
各服务商的配置入口名称略有不同,简米云叫“缓存配置”,酷番云叫“缓存规则”,Cloudflare叫“Caching Rules”,但核心逻辑都是“匹配后缀+指定时间”,价格方面,国内主流CDN按流量计费,与缓存时长无关,海外CDN如Cloudflare免费版也支持设置缓存时间,但规则数量有限,选择哪家取决于你的目标用户地域和预算。
问:如何验证图片缓存时间是否按预期生效?
使用浏览器开发者工具,打开网络面板,点击一个图片请求,查看响应头中的cache-control字段,例如显示max-age=2592000,说明缓存时间为30天,如果显示no-cache或max-age=0,则说明规则未生效或与源站冲突,也可以用在线工具如“站长工具”的HTTP头查询,输入图片URL,返回头信息一目了然。
归根结底,图片后缀只是缓存策略的一个切片,真正要做的,是让CDN缓存与内容的实际变更节奏对齐,定期检查日志中的回源比例,如果回源率突然上升,优先排查缓存时间或源站头设置,这样的调优不是一次性的,而是伴随业务成长的持续性工作。记住核心结论:jpg和png给30天,webp给60天,gif给7天,svg和ico给1年,特殊场景单独覆盖,始终以业务更新频率为准。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/644772.html




