美文网首页
HTTP的缓存实践

HTTP的缓存实践

作者: tangyefei | 来源:发表于2020-02-25 21:02 被阅读0次

HTTP的缓存实践

参考资料

缓存的资料中,难免有一些描述不精确的地方,会误导人,需要自己结合更多的靠近规范的解释去甄别,下述两篇中,第一篇写的非常好,第二篇可以作为辅助:

最佳推荐:浏览器缓存策略之扫盲篇

IMWeb前端博客: HTTP缓存控制小结

前情

首部字段分为:通用首部、请求首部、响应首部、实体首部。

目前主流的HTTP版本是HTTP/1.1,部分网站的版本已经是HTTP/2。

字段

Pragma

  • 是HTTP/1.0的通用首部字段

  • 仅有一个no-cache的值

  • 含义是使用之前必须去服务器校验当前版本是不是最新的

  • 这个字段的作用对象是服务器,因为Pragma is not specified for HTTP responses ,只能在请求头传递给服务器

  • 这个字段的控制权归浏览器,即浏览器作为发起者,决定了是否在请求头部是否加上该字段

  • 该字段已经被抛弃,但为了向下兼容还是保留了它

Expires

  • 是HTTP/1.0的实体首部字段

  • 值是GMT格式的时间值

  • 含义是资源到什么时间之前都是有效的

  • 这个字段的作用对象是浏览器,因为The HTTP Expires header is a response-type header,通常作为相应头传递给浏览器

  • 这个字段的控制权是服务器,即服务器发送给浏览器,浏览器依据它来决定重新请求网页时,是否发送新的请求到服务器

Cache-Control

Last-Modified 和 ETag

  • Last-Modified是实体首部字段,ETag是响应首部字段

  • 他们都是在响应头出现

  • 其中Last-Modified描述了资源最后一次修改时间,ETag(Entity Tag)描述了资源的唯一标识

  • ETag比Last-Modified更精确,因为文件可能在同一秒内被修改了Last-Modified是同一个值,同样修改多次可能内容不变

  • ETag又分为强弱两种模式,强模式字符级别完全相同,弱模式的值前面有个w/的标记,标识语义上没有变化

If-Modified-Since 和 If-None-Match

  • If-Modified-Since 和 If-None-Match 都是请求首部字段

  • 他们会作请求头传递给服务器,值对应的是 Last-Modified 和 ETag 的值

  • 服务器会基于最新的生成的值与If-Modified-Since/If-None-Match的值进行对比,资源过期返回200,否则返回304 Not Modified。

If-Unmodified、If-Match、If-Range

缓存策略

个人博客为例

博客内容是基于Webpack打包的

首次打开网页,第一个请求访问的是html文件,通常来说响应头不会指定Cache-Control:max-age=xxx 或 Expires 这样的字段。

因为网页作为入口文件,必须是最新的,也就是说,不能用强缓存,而是返回ETag 和 Last-Modified。

相应的,图片、js、CSS文件也都是在请求头通过ETag 和 Last-Modified来进行缓存控制的。

在地址栏点击刷新,请求html的时候默认会携带 If-Modified-Since 和 If-None-Match给服务器。

服务器校验发现本地缓存的版本是最新的,返回304,直接利用使用本地的缓存内容即可。

相应的,本地的被依赖的图片、JS、CSS,也会因为HTML使用的是缓存而使用缓存,因此是200 from memory cache 或者 200 from disk cache。

  • 200 from memory cache:资源在内存当中,一般脚本、字体、图片会存在内存当中
  • 200 from disk cache:在磁盘当中,一般非脚本会存在内存当中,如css等

浏览器的刷新行为

  • 浏览器地址前进、后退,在入口的html文件这一级,就会使用强缓存,200 from disk cache
  • 浏览器地址栏回车 或 点击刷新按钮,Command+R(Mac下)刷新,入口文件(注资源)会走协商缓存,派生资源优先强缓存
  • Command+Shift+R 刷新,所有资源都会从服务器请求最新的

补充:

最佳推荐:浏览器缓存策略之扫盲篇明确分类了上述三种行为对应的操作,并且介绍了在Chrome和Firefox上的差异,感兴趣可以实践。

最佳实践

引用最佳推荐:浏览器缓存策略之扫盲篇

  • 不要缓存 HTML,避免缓存后用户无法及时获取到更新内容。
  • 使用Cache-Control和ETag来控制 HTML 中所使用的静态资源的缓存。一般是将Cache-Control的max-age设成一个比较大的值,然后用ETag进行验证。
  • 使用签名或者版本来区分静态资源。这样静态资源会生成不同的资源访问链接,不会产生修改之后无法感知的情况。

相关文章

  • HTTP的缓存实践

    HTTP的缓存实践 参考资料 缓存的资料中,难免有一些描述不精确的地方,会误导人,需要自己结合更多的靠近规范的解释...

  • HTTP缓存深入实践

    网络特有的延迟以及数据传输的成本,制约互联网快速获取Web资源。为此,HTTP协议引入缓存以空间换时间,使浏览器缓...

  • http 缓存之实践联系

    使用场景说明 前端部署的资源是静态文件,大致可分为两类 html css、js、img、iconfont 强制缓存...

  • Tomcat环境下设置HTTP强缓存

      在之前的一篇文章 《HTTP缓存详解》 中详细的整理了关于HTTP缓存的知识点,这一篇通过实践,具体验证如何设...

  • HTTP缓存原理

    什么是HTTP缓存 HTTP缓存通常指浏览器缓存,基于HTTP中header字段实现HTTP缓存分为强缓存和协商缓...

  • 前端缓存

    前端缓存 前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务...

  • 前端缓存详解

    一、前言 前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务...

  • PWA笔记一:Web的万物基础缓存

    前言 这里讨论的缓存包括两种,一种是HTTP缓存,一种是Service Worker缓存。 HTTP缓存 HTTP...

  • 前端缓存的理解 或者 前端数据持久化的理解(强制缓存、协商缓存)

    前端缓存分为HTTP缓存和浏览器缓存 其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务器代码上设置;而...

  • 浅谈浏览器缓存

    前言 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的。 HTTP 缓存 ...

网友评论

      本文标题:HTTP的缓存实践

      本文链接:https://www.haomeiwen.com/subject/zyrqchtx.html