为什么浏览器初次进入页面时会直接使用强缓存,导致资源不会更新,后续刷新则会使用协商缓存?

使用浏览器打开网址的时候网站的文档文件(index.html)会直接从缓存中读取(强缓存),不会发起请求,而之后再从这个页面点击刷新按钮时就不会直接从缓存中读取了,而是进行协商缓存,如果文件发生改变了则会去获取最新的文件。
由于初次进入页面的时候直接从缓存中读取,所以导致了就算服务器上的文件改变了浏览器也不会更新,我希望可以在第一次进入浏览器的时候就进行协商缓存,如果文件发生了变化就重新请求资源。
因此,我想请教一下:

1.为什么产生这种现象
2.有什么解决方案,我现在想到的是通过js进行一次页面刷新
3.chrome浏览器可不可以使用js进行强制刷新(等同于 Ctrl+F5 的功能),这个问题只是顺带问的,上面问题中提到的刷新就是普通的刷新。

image.png
使用的 http-server npm 包搭建的资源服务器。
问题展示

  1. image.png
    就算服务器上的资源更新了,此次进入页面也不会获取最新的内容
    image.png
  2. 点击当前页面的刷新按钮(或者按 F5)
    如果资源更新了,此次刷新就会获取最新的内容
    image.png

补充

响应头中没有设置Cache-Control的也会有这种情况
image.png
image.png

阅读 1.6k
avatarAI BotBETA
  1. 为什么产生这种现象

这种现象是由于 HTTP 缓存机制引起的。浏览器在初次访问一个网页时,会检查响应头中的 Cache-ControlETag 字段,如果它们指示资源应该被缓存,那么浏览器就会直接从本地缓存中读取资源,而不会向服务器发送请求。这就是所谓的强缓存。

然而,当浏览器再次刷新页面时,它会使用协商缓存机制。协商缓存是当客户端(在此处为浏览器)和服务器都有缓存的资源时,客户端会向服务器发送一个带有 If-None-Match 头的请求,询问服务器是否有新的资源版本。如果服务器回复说没有新的版本(即 ETag 没有变化),那么客户端就会使用缓存的资源。如果服务器回复说有新的版本,那么客户端就会从服务器获取新的资源。

  1. 有什么解决方案

解决这个问题的一种方法是使用 JavaScript 进行页面刷新。当页面加载时,你可以使用 JavaScript 检查资源是否需要更新,如果需要,你可以手动发送一个刷新请求。例如,你可以使用 location.reload(true) 来强制浏览器从服务器加载页面,而不是从缓存中。

  1. Chrome 浏览器可不可以使用 JS 进行强制刷新(等同于 Ctrl+F5 的功能)

Chrome 浏览器并不直接支持使用 JavaScript 进行强制刷新。Ctrl+F5 是一种特殊的刷新方式,它忽略缓存并直接从服务器加载资源。然而,你可以使用 JavaScript 来模拟这种行为。你可以通过设置 location.cachePolicy 来改变缓存策略。例如,你可以使用 cachePolicy.bypassCache 来忽略缓存并直接从服务器加载资源。请注意,这只适用于由相同源(即同源)的脚本设置的策略。

希望这些信息对你有所帮助!

1 个回答

移除 Cache-Control: max-age ,或者设置为 0,这会导致走强缓存

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题