这个坑值得记一笔。CDN 开了自动 webp,同一图片地址对支持 webp 的客户端给 webp,对不支持的给原图,可响应里没有 Vary: Accept,边缘缓存把两种结果混在一起。

刚开始盯着「图片搜索抓到的缓存版本和页面展示的尺寸对不上」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。自动格式转换没有输出 Vary: Accept;缓存键只按 URL 计算,完全不看请求头;回源与边缘的格式策略不一致,重试时拿到另一版。

先看图片响应头有没有 vary

curl -sI -H 'Accept: image/webp' https://cdn.lu0.cn/2026/11/a.jpg | grep -i vary

然后在 CDN 规则里补上 Vary: Accept

再往下按格式拆分缓存键

proxy_cache_key $scheme$host$uri$http_accept;

末了清一次图片缓存后复检

curl -X PURGE https://cdn.lu0.cn/2026/11/a.jpg

怎么算真的好了,看的是同一批现象。同一地址在两种 Accept 下返回各自格式且头里带 Vary,图片搜索的缩略图不再错位,裂图投诉消失。

容易忽略的是,自动转换本身没问题,缺的是让缓存知道内容会变,一行 Vary 能省掉后面全部排查。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189