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