curl -sI http://127.0.0.1/static/app.js -H 'Accept-Encoding: br'
curl -sI http://127.0.0.1/static/app.js -H 'Accept-Encoding: gzip'

CDN 上同一 URL 只有一份缓存,开了 brotli 之后,老安卓机请求拿到 br 编码的响应,页面显示乱码,控制台报 ERR_CONTENT_DECODING_FAILED。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:缓存键只按 URL 算,没有把 Accept-Encoding 算进去。第一个请求协商成 br,后面的客户端不管支不支持都拿到这一份。Vary 里没写这个头,缓存层就没有理由区分。

「Vary 缺压缩维度」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:在源站响应里加 Vary: Accept-Encoding;确认 CDN 把这个头纳入缓存键;对不支持 br 的客户端回落到 gzip;用不同 Accept-Encoding 请求同一地址 对比响应头。

确认没问题再收工,两种 Accept-Encoding 拿到对应编码的内容 Vary 里有 Accept-Encoding 老设备不再乱码。

作者 9823189