HTTP 缓存标头:必须重新验证如何工作?

HTTP 缓存标头:必须重新验证如何工作?

使用跟踪,我收到了带有以下标题的响应:

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 并解释缓存如何处理特定的响应指令。

相关内容