浅谈http协定(一):与缓存相干的头信息Etag、Last-Modified、Cache-Control

在讲这几个属性之前,先温习下浏览器的缓存机制,再连系相识一下Last-Modified / If-Modified-Since、Etag / If-Match、cache-control / expires

浏览器缓存位置分为四种,其优先级递次以下:
Service Worker、Memory Cache、Disk Cache、Push Cache,当上述四个缓存位置中的缓存都没有掷中时,则会向服务器提议请求。
Service Worker: 不做相识;
Push Cache: 不做相识;
Memory Cache: 即内存中的缓存,其特点是容量小、读取高效、持续性短,会跟着历程的开释而开释,在内存运用率低、缓存小尺寸资本时,会以 Memory Cache 为优先;
Disk Cache: 即磁盘中的缓存,其特点是容量大、读取迟缓、持续性长,任何资本都能存储到磁盘中,在内存运用率高、缓存大尺寸资本时,会以 Disk Cache 为优先;

《浅谈http协定(一):与缓存相干的头信息Etag、Last-Modified、Cache-Control》

浏览器缓存战略分为两种,强缓存和协商缓存:
强迫缓存
用户发送的请求,直接从客户端缓存中猎取,不发送请求到服务器,不与服务器发作交互行动。
协商缓存
用户发送的请求,发送到服务器后,由服务器剖断是不是从缓存中猎取资本。

可用以下流程图来归纳综合浏览器的缓存机制:
《浅谈http协定(一):与缓存相干的头信息Etag、Last-Modified、Cache-Control》

浏览器的缓存主假如针对静态资本举行缓存,如图片、文件、js等。

当用户提议请求时,浏览器先实行(a)步骤,检察是不是有缓存,假如我们用的是谷歌浏览器,也能够在地址栏输入chrome://cache/检察你提议的请求链接是不是在缓存列表中。假如想主动消灭缓存,也能够在请求头信息中到场“Cache-Control: no-store”来制止缓存。下次是缓存列表中翻开的缓存:
《浅谈http协定(一):与缓存相干的头信息Etag、Last-Modified、Cache-Control》

假如浏览器中有缓存则实行(b)步骤,检察缓存是不是逾期,主假如经由过程缓存中存储的相应头信息中的缓存标识字段 Expires 或 Cache-Control 来考证缓存资本是不是逾期。Expires 是服务器端在相应请求时用来划定资本的失效时候。Cache-Control 是服务器端在相应请求时用来划定资本是不是需要被浏览器缓存以及缓存的有用时候等。Cache-Control 重要取值以下:
《浅谈http协定(一):与缓存相干的头信息Etag、Last-Modified、Cache-Control》
缓存的时效由max-age决议。在max-age设定的时候内对当前资本提议接见后运用的都是浏览器内部的缓存!凌驾max-age设定的时候后浏览器会挑选运用协商缓存。
相应头信息中的no-cahce,示意不运用强迫缓存,直接进入协商缓存,请求头信息中的no-cache,则示意要从新猎取请求,其作用类似于no-store,相应头信息的no-cache和max-age=0和请求头信息的max-age=0的作用是一样的:都请求在运用缓存之前举行考证。

Expires 是 HTTP 1.0 的字段,而 Cache-Control 是 HTTP 1.1 的字段,当 Expires 与 Cache-Control 同时存在时,Cache-Control 的优先级要高于 Expires。为了保证浏览器兼容,平常两个字段后端都邑同时返回给前端,如果掷中缓存(即存在缓存资本而且缓存资本未逾期),则浏览器相应 HTTP Status Code 200,并直接运用缓存资本作为返回效果,不需要提议 HTTP 请求,为强迫缓存;如果存在缓存资本但缓存资本已逾期,则进入下一步骤协商缓存

(c)协商缓存相干的缓存标识字段是 Last-Modified 和 Etag。
Last-Modified 是服务器端在相应请求时用来申明资本的末了修正时候。与之对应的是 If-Modified-Since 字段,在协商缓存过程当中,浏览器发送的 HTTP 请求中 Header 中会带上 If-Modified-Since 字段,值为缓存资本 Last-Modified 属性的值。
当服务器端接收到带有 If-Modified-Since 的请求时,则会将 If-Modified-Since 的值与被请求资本的末了修正时候做对照。假如雷同,申明资本没有新的修正,则相应 HTTP Status Code 304,浏览器会继承运用缓存资本;假如末了修正时候比较新,则申明资本被修正过,则相应 HTTP Status Code 200,并返回最新的资本。
《浅谈http协定(一):与缓存相干的头信息Etag、Last-Modified、Cache-Control》
Etag 是服务器端在相应请求时用来申明资本在服务器端的唯一标识。与之对应的是 If-None-Match 字段,在协商缓存过程当中,浏览器发送的 HTTP 请求中 Header 中会带上 If-None-Match 字段,值为该缓存资本 Etag 属性的值。
当服务器端接收到带有 If-None-Match 的请求时,则会将 If-None-Match 的值与被请求资本的唯一标识做对照。假如雷同,申明资本没有新的修正,则相应 HTTP Status Code 304,浏览器会继承运用缓存资本;假如差别,则申明资本被修正过,则相应 HTTP Status Code 200,并返回最新的资本。
《浅谈http协定(一):与缓存相干的头信息Etag、Last-Modified、Cache-Control》
Last-Modified 是 HTTP 1.0 的字段,而 Etag 是 HTTP 1.1 的字段,当 Last-Modified 与 Etag 同时存在时,Etag 的优先级要高于 Last-Modified。Etag 的涌现主假如为相识决 Last-Modified 存在的题目。

末了,最新请求下来的资本,浏览器会依据Expires 与 Cache-Control推断是不是举行缓存。

<完>

    原文作者:广州鹏少
    原文地址: https://segmentfault.com/a/1190000019322243
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞