为什么 Chrome 不缓存响应,即使 cache-control header 存在?
Why isn't Chrome caching responses, even when cache-control header is present?
我想了解什么时候 Chrome 缓存内容以及它如何决定缓存的内容。
例如,我访问了这篇新闻文章并打开了 DevTools。
https://www.nextgov.com/ideas/2020/07/so-much-decentralized-internet/167281/
我已确保缓存已启用(即未选中“禁用缓存”)。
当我刷新页面时,再次调用 167281/
。它不是从缓存中检索的。尽管在响应中设置了 cache-control
header。
为什么 Chrome 不在页面上缓存这个(以及许多其他资源)?
服务器return的 HTTP 状态代码 304,这意味着告诉浏览器它的缓存仍然有效,应该使用它。
引自https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching:
“当发出验证请求时,服务器可以忽略验证请求和正常的 200 OK 响应,也可以 return 304 Not Modified(空 body)指示浏览器使用它的缓存副本。后一个响应还可以包括 headers 更新缓存文档的过期时间
当您设置 cache-control: max-age=...
时,您是在告诉请求者可以安全地缓存资源这么长时间。
但这取决于每个浏览器(或一般的应用程序)来决定何时实际缓存。移动浏览器可能只会缓存少量资源,而桌面浏览器可能会做相反的事情。
鉴于 your example 在 Firefox Developer Edition 80.0b5 中重新加载页面后开始缓存,将请求 cache-control 更改为 if-modified-since
。这意味着浏览器缓存了资源,但会向服务器查询资源,只是为了检查它是否仍然 up-to-date。如果是,服务器(或某些中间网络路由器)将只是 return 没有实际内容的 304 响应,这正是您显示的情况:
但是当我在 URL 栏中按下回车键或者当我使用导航按钮时,在没有任何实际请求的情况下使用了缓存:
重要的是要补充一点,cache-control 只是对实际请求者的提示:中介机构还将使用此信息来缓存响应并使下一个请求加载得更快。而且即使主要资源(html 页面)被缓存,页面中链接的所有资产都有自己的 cache-control
标签。
dev-tools 上的“已转移”列似乎显示了资源是否在本地有效缓存:
我想了解什么时候 Chrome 缓存内容以及它如何决定缓存的内容。 例如,我访问了这篇新闻文章并打开了 DevTools。 https://www.nextgov.com/ideas/2020/07/so-much-decentralized-internet/167281/
我已确保缓存已启用(即未选中“禁用缓存”)。
当我刷新页面时,再次调用 167281/
。它不是从缓存中检索的。尽管在响应中设置了 cache-control
header。
为什么 Chrome 不在页面上缓存这个(以及许多其他资源)?
服务器return的 HTTP 状态代码 304,这意味着告诉浏览器它的缓存仍然有效,应该使用它。
引自https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching: “当发出验证请求时,服务器可以忽略验证请求和正常的 200 OK 响应,也可以 return 304 Not Modified(空 body)指示浏览器使用它的缓存副本。后一个响应还可以包括 headers 更新缓存文档的过期时间
当您设置 cache-control: max-age=...
时,您是在告诉请求者可以安全地缓存资源这么长时间。
但这取决于每个浏览器(或一般的应用程序)来决定何时实际缓存。移动浏览器可能只会缓存少量资源,而桌面浏览器可能会做相反的事情。
鉴于 your example 在 Firefox Developer Edition 80.0b5 中重新加载页面后开始缓存,将请求 cache-control 更改为 if-modified-since
。这意味着浏览器缓存了资源,但会向服务器查询资源,只是为了检查它是否仍然 up-to-date。如果是,服务器(或某些中间网络路由器)将只是 return 没有实际内容的 304 响应,这正是您显示的情况:
但是当我在 URL 栏中按下回车键或者当我使用导航按钮时,在没有任何实际请求的情况下使用了缓存:
重要的是要补充一点,cache-control 只是对实际请求者的提示:中介机构还将使用此信息来缓存响应并使下一个请求加载得更快。而且即使主要资源(html 页面)被缓存,页面中链接的所有资产都有自己的 cache-control
标签。
dev-tools 上的“已转移”列似乎显示了资源是否在本地有效缓存: