[ http 缓存] 为什么 Cache-Control 还需要 immutable 这个指令?

52 天前
 justdoit123

MDN 官方的说明:

The immutable response directive indicates that the response will not be updated while it's fresh.

Cache-Control: public, max-age=604800, immutable

就像上面这段代码。在资源未过期的情况下,难道没有 immutable,浏览器在刷新的时候也会去 server 询问这个资源是否过期吗?

Cache-control: max-age=604800 已经说明了这个资源是强缓存。在未过期的情况下,本来就不会再去 server 请求。

所以,我不太理解为什么 Cache-Control 还需要 immutable 这个指令?

感谢分享指正。

1213 次点击
所在节点   科技
8 条回复
bxb100
52 天前
zy445566
52 天前
反正据我观察浏览器和浏览器的 iframe 和客户端表现都不一样

在浏览器里面 max-age 还会看协商缓存 比如 etag 和 Last-Modified ,比如如果 etag 存在,有 max-age 还会请求服务器并发送客户端的 If-None-Match 值,如果服务器接受到 If-None-Match 一致则返回 304 ,返回体无内容,如果不一致就会返回 200 并将内容放在消息体返回。

但是在浏览器的 iframe 和客户端就很奇怪,不会发送请求,我这边把谷歌浏览器的调试器连接到 iframe 和客户端的 web 里面都是显示返回头是 200 ,但是后面标志 from disk cache ,也就是压根没有请求服务端
zy445566
52 天前
@zy445566 所以基于上面,如果在浏览器里面可能是存在 immutable 必要的
tool2dx
52 天前
@zy445566 浏览器地址栏手动输入 url 似乎不走缓存,只有 ajax/iframe 才走。
sagaxu
52 天前
在未过期的情况下,本来就不会再去 server 请求。

那 304 是干嘛用的?
justdoit123
52 天前
@bxb100 感谢~ 这个 Q&A 说得很清楚。
justdoit123
52 天前
@sagaxu 你说的那是协商缓存吧? Expires 与 Cache-Control max-age=XXX 是强缓存。
justdoit123
52 天前
@zy445566
@tool2dx

先前实验下来的确有这个发现。浏览器对于当前 document 访问,是会忽略缓存相关的 Header 。即便我问的这个 `immutable` 也是会忽略的。

iframe 确实没实验过。感谢分享!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1060182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX