使用跟踪,我收到了带有以下标题的响应:
Cache-control: must-revalidate
此外,没有发送“Expires”标头。但是,我们的本地代理正在缓存这些响应,因此在进行编辑时,需要“硬刷新”页面才能更新。代理是否行为不当?其他标头可能与主题相关:
Connection Keep-Alive
Proxy-Connection Keep-Alive
Keep-Alive timeout=15, max=100
答案1
HTTP 允许缓存响应,即使它们没有明确的 Expires 或 Cache-Control 标头。
具体来说,它们可以计算具有某些 HTTP 状态代码(包括)的响应的所谓启发式新鲜度200 OK
。通常,这是基于标头的值Last-Modified
;例如,如果 LM 是 1 天前首次存储响应时,缓存可能会认为可以安全地假设它在 2 小时内是新鲜的。
must-revalidate
是一条指令,告知缓存一旦某项内容过期,就必须在源服务器上检查。如果不存在该内容,缓存(通常)可以在特殊情况下(例如,如果它们与源服务器失去联系)使用过期响应。
因此,不,这个缓存看起来没有问题,尽管听起来它在计算启发式新鲜度时可能有点激进。如果您根本不想让缓存存储响应,请尝试Cache-Control: no-store
,或者(最好)只设置一个显式值max-age
来控制它被视为新鲜的时间。
您可能有兴趣查看 IETF HTTPbis 工作组当前有关缓存的文档:
https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p6-cache
希望这比 RFC2616 更清晰一些。
还,http://redbot.org/将检查 URL 并解释缓存如何处理特定的响应指令。