HTTP缓存

HTTP缓存

HTTP报文

HTTP报文:作为浏览器和服务器通讯时发送和响应的数据块。浏览器向服务器发送数据时会发送请求报文(Request),服务器响应浏览器的请求时,会发送响应报文(Response)。

请求报文:包含请求方法、统一资源定位符(URL)、协议版本号、MIME信息等。

响应报文:包含协议版本号、响应状态码等信息。

缓存规则解析

当用户第一次访问页面的时候,浏览器的缓存数据库是没有缓存的,需要向服务器直接请求数据,服务器将会把资源和缓存规则返回给浏览器,浏览器将把资源和缓存规则进行缓存。具体如图所示:

强缓存(from disk cache 200)

已存在缓存时,请求资源流程如下:

从中可以看出,强缓存如果缓存数据库中已存在数据且未失效,那么将不会和服务器进行交互,直接从资源数据库中取。

对于强缓存来说,响应头将会有两个字端来标识失效规则:Expires/Cache-Control

Expires:Http1.0。它的值为服务端返回的到期时间。即下一次请求时的时间小于该时间的时候,直接使用缓存数据。

Cache-Control:Http1.1 。Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。

private:客户端可以缓存。

public: 客户端和代理服务器都可缓存。

max-age=xxx:缓存的内容将在 xxx 秒后失效。

no-cache:需要使用对比缓存来验证缓存数据。

no-store:所有内容都不会缓存,强制缓存,对比缓存都不会触发。

对比缓存(304)

已存在缓存数据时,请求资源的流程:

对比缓存,顾名思义,需要进行比较判断是否可以使用缓存。

浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。

再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。

在对比缓存生效时,状态码为304,并且报文大小和请求时间大大减少。

原因是,服务端在进行标识比较后,只返回header部分,通过状态码通知客户端使用缓存,不再需要将报文主体部分返回给客户端。

If-Modified-Since/Last-Modified:Http1.0 。浏览器在访问服务器的时候,服务器返回的响应报头中会携带Last-Modified字端,告诉浏览器文件最后修改的时间。当浏览器在此访问服务器的时候,会携带If-Modified-Since,告诉服务器上次文件修改的时间,服务器收到该字段之后,和服务器文件资源的最后修改时间做对比,判断资源是否有改动。若改动过,则返回200,并将整个资源返回。若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。Last-Modified,顾名思义,指的是文件最后的修改时间,而且只能精确到1s以内

If-None-Match/E-tag:Http1.1 。服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。和Last-Modified不同,E-tag更精确,它是类似于指纹一样的东西,基于FileEtag INode Mtime Size生成,也就是说,只要文件变,指纹就会变,而且没有1s精确度的限制。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!