AWS S3替换图片后HTML引用在SES发送的邮件中仍显示旧图的原因是什么
问题根因及解决方案
核心原因1:邮件服务商/客户端的图片代理缓存
- 绝大多数主流邮件服务(比如Gmail、Outlook、国内邮箱服务商等)为了防范恶意图片追踪、提升加载速度,都会通过自身的代理服务预加载邮件内的所有外链图片,再把缓存后的代理URL替换你原始的S3 Object URL返回给用户端展示。
- 你替换S3文件后,代理服务还没过期失效的旧缓存不会主动同步S3的更新,就会继续返回旧图,这个和你直接访问S3 URL、在线HTML查看器能拿到新图的表现完全不冲突,因为后两者没有走邮件服务的代理缓存层。
核心原因2:S3本身的缓存配置未合理设置
- 如果你上传S3对象时没有主动设置
Cache-Control头,S3默认会给对象加24小时的缓存有效期,就算没有邮件代理的存在,中间CDN、浏览器缓存也可能持有旧版资源。 - 就算你是同文件名覆盖上传,S3也不会主动触发各个缓存节点的失效,所有存在缓存的中间节点都会等到缓存过期后才会拉取新文件。
临时&永久解决方法
- 临时解决:给图片URL加随机查询参数后缀,比如原来的
https://bucket.s3.region.amazonaws.com/img.png改成https://bucket.s3.region.amazonaws.com/img.png?v=2,缓存系统会把带不同参数的URL识别为完全不同的资源,就会主动拉取新图,不需要修改S3端的文件名。该方法可以最快验证是否是缓存导致的异常。 - 永久解决:
- 给S3中需要高频更新的图片设置合理的
Cache-Control头,比如max-age=300(缓存5分钟),降低缓存持有旧资源的时长。 - 后续更新图片时尽量用不同的文件名,避免同名覆盖导致的多端缓存不同步问题。
- 如果是用CloudFront搭配S3的场景,更新文件后主动发起对应路径的缓存失效操作。
- 给S3中需要高频更新的图片设置合理的
内容的提问来源于stack exchange,提问作者daivalo
相关产品推荐
相关产品推荐

