先看现象。搜索接口返回 JSON,CDN 按 URL 缓存但没有 Vary,A 用户搜「发票」的结果被缓存后,B 用户搜「退款」拿到的还是发票列表,前端展示全乱。

真正麻烦的地方在于,几个原因的现象几乎一样。响应没写 Cache-Control,CDN 按默认策略缓存了接口。少数情况下是Vary 只写了 Accept-Encoding,没按查询参数区分。

还有一种情况,缓存键忽略了 q 参数的大小写和编码差异。

直接请求接口看缓存头

curl -sI 'https://www.example.com/api/search?q=abc' | grep -Ei 'cache|vary'

接着确认 CDN 是否命中缓存

curl -sI 'https://www.example.com/api/search?q=abc' | grep -i x-cache

给接口加 no-store 并刷缓存

curl -X PURGE 'https://www.example.com/api/search?q=abc'

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

怎么算真的好了,看的是同一批现象。接口改成不缓存后,同一 URL 连续两次请求返回不同结果,前端串号现象消失。

补一句。搜索结果属于个性化内容,接口层加 no-store 比在 CDN 上配例外规则更可靠。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189