HTTP 缓存标头:must-revalidate 应该如何工作?

Bob*_*ack 2 http proxy cache

使用trac,我收到带有以下标头的响应:

Cache-control: must-revalidate
Run Code Online (Sandbox Code Playgroud)

此外,没有发送“过期”标头。然而,我们的本地代理正在缓存这些响应,因此在进行编辑时,页面需要“硬刷新”才能更新。代理行为不正常吗?其他可能相关的标题:

Connection          Keep-Alive
Proxy-Connection    Keep-Alive
Keep-Alive          timeout=15, max=100
Run Code Online (Sandbox Code Playgroud)

小智 8

HTTP 允许缓存响应,即使它们没有明确的 Expires 或 Cache-Control 标头。

具体来说,他们可以为具有某些 HTTP 状态代码(包括200 OK)的响应计算自己所谓的启发式新鲜度。通常,这是基于Last-Modified标头的值;例如,如果第一次存储响应时 LM 是 1 天前,则缓存可能会认为假设它在 2 小时内保持新鲜是安全的。

must-revalidate是一条指令,告诉缓存一旦某些东西变得陈旧,就必须在源服务器上进行检查。如果它不存在,缓存可以(通常)在异常情况下使用陈旧的响应(例如,如果它们与源服务器失去联系)。

所以,不,这个缓存看起来不像是行为不端,尽管听起来它在计算启发式新鲜度方面可能有点激进。如果您根本不希望缓存存储响应,请尝试Cache-Control: no-store,或者(最好)只设置一个显式max-age来控制它被认为是新鲜的时间。

您可能有兴趣查看 IETF HTTPbis 工作组当前涵盖缓存的文档:

http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache

希望这比 RFC2616 更清楚一点。

此外,http://redbot.org/将检查 URL 并解释缓存如何处理特定的响应指令。