下单接口第二次提交同一请求,源站日志里没有记录,返回体却和第一次一模一样,订单号都相同,CDN 日志显示 200 Hit。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
curl -s -o /dev/null -w '%{http_code}' -X POST https://example.com/api/order -d 'sku=1'
curl -sI https://example.com/api/order | grep -i cache-control
缓存层把 POST 也纳入了缓存规则,只按 URL 做了键,请求体完全没参与。只要 URL 相同就返回旧响应。协议上 POST 默认不可缓存,配置写错就会发生。这一点先确认清楚,后面就不用反复试。
「POST 被缓存」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,在 CDN 规则里把 POST 排除出缓存;源站对写接口返回 Cache-Control: no-store;用不同的请求体各提交一次 看源站是否都收到;确认缓存键里没有把请求方法忽略掉。
改完照着核一遍,两次 POST 都能在源站日志里看到 返回的订单号不同 X-Cache 显示 Miss。
