5

据我了解,这就是浏览器缓存的工作方式。假设,一个遥远的未来标头已设置为假设一年,并且 foo.js 设置为缓存。以下是一些场景:

  1. 第一次访问页面,server返回200,foo.js缓存一年。

  2. 下次访问时,浏览器会检查缓存,但如果 foo.js 已被修改,则必须检查服务器。如果不是,服务器返回 304 - Not Modified。

  3. 用户已经在页面上(并且 foo.js 在缓存中)单击链接以转到另一个页面,浏览器查看 foo.js 的缓存版本并提供它而无需往返服务器并返回 200(缓存)。

  4. 用户已经在页面上(并且 foo.js 在缓存中)并且由于某种原因点击 F5/Reload,浏览器检查缓存但必须往返于服务器并检查 foo.js 是否已被修改。如果不是,服务器返回 304。

如您所见,每当刷新页面时,它总是需要访问服务器以检查文件是否已被修改。我知道这不是很多,服务器只会返回标头信息,但在某些情况下往返时间非常重要。

问题是,有没有办法可以避免这种情况,因为我已经设置了文件的过期时间。我只是希望它始终从缓存中获取它,直到过期或用其他东西替换文件(通过版本控制)。

4

2 回答 2

0

据我了解,按 F5/Ctrl-R 是浏览器特定的操作,因此将控件留给浏览器。

如果用户在点击另一个动作之前清除了缓存怎么办?因此,即使在 F5 中有强制使用缓存的 HTTP 规范,也不能保证您能够满足您的需求。

只需配置和编码以尽可能多地缓存,其余的留给用户。

于 2012-11-18T08:37:23.403 回答
0

看起来,当您导航到一个页面(即在 URL 栏中输入地址或单击链接)时,会从缓存中获取资源,而无需向服务器发送 HEAD 请求。但是当您刷新页面时,它会执行 HEAD 请求和 RTT。

这在 IE 的开发者工具的网络选项卡中看起来更清楚。如果您看到 initator 列,它表示navigate第一种情况和refreshfor CTRL+Ror F5

您可以通过在它们上添加事件侦听器并执行 a来覆盖F5and行为并阻止默认行为或类似的行为。这将导致页面导航而不是刷新。CTRL+Rwindow.location = window.locationevent.peventDefault

另外,我没有测试缓存资源在服务器上实际发生变化的情况。如果这被证明是一个问题,您可以通过资源的版本编号和生成带有指向最新版本资源的 URL 的 HTML 来解决它(有点像 HTML5 离线应用程序的缓存清单问题)。

编辑:但是,如果用户单击浏览器的刷新按钮,这并不能解决问题;onbeforeunload在这种情况下,事件可能会有所帮助。

于 2012-11-18T08:53:32.527 回答