chrome 浏览器仅在使用 etag 和 last-modified-date 时才显示 200(来自磁盘缓存)

Posted

技术标签:

【中文标题】chrome 浏览器仅在使用 etag 和 last-modified-date 时才显示 200(来自磁盘缓存)【英文标题】:chrome browser shows 200(from disk cache) only if etag and last-modified-date both are used 【发布时间】:2021-03-15 01:59:37 【问题描述】:

为什么只有在使用 etag 和 last-modified-date 时,chrome 浏览器才显示 200(来自磁盘缓存),而不是仅设置了 etag 响应标头? 注意:etag 生成已正确完成。 就我而言,我需要 etag 并且实际上并不需要最后修改日期

【问题讨论】:

【参考方案1】:

TL;DR

因为大多数浏览器会根据Last-Modified time [1] 在没有Cache-Control显式过期时间 时分配一个启发式过期时间。

可以将Cache-Control: must-revalidate 标头添加到缓存控制 [2] 的响应中。


[1]https://datatracker.ietf.org/doc/html/rfc7234#section-4.2.2

如果响应具有 Last-Modified 标头字段(的第 2.2 节 [RFC7232]),鼓励缓存使用启发式过期值 这只是自那时以来间隔的一小部分。 该分数的典型设置可能是 10%。

[2]https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#revalidation_and_reloading

【讨论】:

【参考方案2】:

TL;DR

新MDN链接: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#up-to-date_contents_always

对于动态生成的内容,或静态但经常更新的内容,您希望用户始终收到最新版本。

如果您因为不打算缓存响应而没有添加 Cache-Control 标头,则可能会导致意外结果。缓存存储允许启发式地缓存它——因此,如果您对缓存有任何要求,您应该始终在 Cache-Control 标头中明确指出它们。

在响应中添加 no-cache 会导致服务器重新验证,因此您可以每次都提供新的响应 - 或者如果客户端已经有新的响应,则只需响应 304 Not Modified。

【讨论】:

以上是关于chrome 浏览器仅在使用 etag 和 last-modified-date 时才显示 200(来自磁盘缓存)的主要内容,如果未能解决你的问题,请参考以下文章

Chrome etag 总是显示 200 ok 但 curl 得到 304 未修改

选项(失败)仅在 Chrome 和 Firefox 上

POST 请求返回 401 Unauthorized(仅在 Chrome 中)

仅在 Chrome 上定位两种屏幕尺寸

仅在 Chrome 上出现 iframe 高度问题

如何创建一个仅在 chrome 中打开并使用禁用标志的超链接