"Cache-Control:max-age = 0,no-cache"但浏览器绕过服务器查询(并点击缓存)?

Geo*_*ins 16 google-chrome browser-cache http-headers

我正在使用Chrome 40(这样的东西很漂亮和现代).

Cache-Control: max-age=0, no-cache在所有页面上设置 - 所以我希望浏览器只在其首先检查服务器并获得304 Not Modified响应时才使用其缓存中的内容.

然而,在按下后退按钮时,浏览器会快速点击其自己的缓存,而无需检查服务器.

如果我打开同一页面,就像我使用后退按钮一样,在新选项卡中,它会检查服务器(并在303 See Other事情发生变化时获得响应).

请参阅下面的屏幕截图,其中显示了Chrome开发者工具的"网络"标签中两种不同情况的输出.

我认为我可以使用max-age=0, no-cache更轻量级的替代品no-store,我不希望用户通过后退按钮看到陈旧数据(但数据是无价值的,因此可以缓存).

我的理解no-cache(参见此处此处的SO)是浏览器必须始终重新验证所有响应.那么为什么Chrome在使用后退按钮时不会这样做?

no-store唯一的选择吗?


200 按下后退按钮的响应(来自缓存):

在此输入图像描述

303 在新标签中请求同一页面时的响应:

在此输入图像描述

Ext*_*t3h 25

来自http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

无缓存

如果no-cache指令没有指定字段名,那么缓存绝不能使用响应来满足后续请求,而不能成功地与源服务器重新验证.这允许源服务器甚至通过已配置为返回对客户端请求的陈旧响应的缓存来防止缓存.

如果no-cache指令确实指定了一个或多个字段名,则缓存可以使用响应来满足后续请求,但受缓存的任何其他限制.但是,在未成功重新验证原始服务器的情况下,不得在对后续请求的响应中发送指定的字段名称.这允许源服务器阻止在响应中重用某些头字段,同时仍允许缓存响应的其余部分.

除了名称暗示,no-cache不要求响应不能存储在缓存中.它只指定缓存的响应不能重用,以便在不重新验证的情况下为后续请求提供服务,因此它是一种简写must-revalidate, max-age=0.

由浏览器决定什么作为后续请求,并且根据我的理解,使用后退按钮不是.此行为因浏览器引擎而异.

no-store 禁止对所有请求使用缓存响应,而不仅仅是后续请求.

请注意,即使使用no-store,RFC实际上也允许客户端存储响应以供在历史缓冲区中使用.这意味着即使no-store已经指定,客户端仍可以使用缓存的响应.

后期行为包括在浏览器历史记录中使用其原始页面标题记录页面的情况.另一个用例是各种移动浏览器的行为,在用户可能想要中止之前,下一页已完全加载之前不会丢弃上一页.

有关后退按钮行为的说明:根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.13,它不受任何缓存标头的限制.

用户代理通常具有历史机制,例如"后退"按钮和历史列表,其可用于重新显示先前在会话中检索的实体.

历史机制和缓存是不同的.特别是历史机制不应该试图显示资源当前状态的语义透明视图.相反,历史机制旨在准确显示用户在检索资源时看到的内容.

默认情况下,到期时间不适用于历史记录机制.如果实体仍在存储中,则即使实体已过期,历史机制也应该显示它,除非用户已专门配置代理以刷新过期的历史文档.

这意味着在使用后退按钮时不尊重任何缓存控制标头是建议的行为.如果您的浏览器恰好遵守过期的过期日期或者no-store不仅将该指令应用于浏览器缓存而且还应用于历史记录,那么它实际上已经偏离了该建议.

如何解决它:
你不能,你不应该.如果用户返回之前访问过的页面,大多数浏览器甚至会尝试恢复视口.如果这是用户离开页面之前的原始行为,您可以使用像AJAX这样的延迟机制来刷新内容,否则您甚至不应该修改内容.

  • @GeorgeHawkins http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.13`历史机制和缓存是不同的.特别是历史机制不应该试图显示资源当前状态的语义透明视图.相反,历史机制旨在准确显示用户在检索资源时看到的内容 (3认同)