【缓存】http协议头

时间:2021-05-04 05:00:47

【简介】

       缓存分很多种:服务器缓存,第三方缓存,浏览器缓存、代理缓存、网关缓存、数据库缓存等。其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源。今天总结介绍的也与浏览器缓存相关。

浏览器缓存肯定都很熟悉,简单说就是浏览器在磁盘上对最近用户请求的数据进行存储,当我们再次请求这个页面时,浏览器就可以从本地磁盘读取并显示。

浏览器缓存主要有两类:

      缓存协商:Last-modified,Etag

      彻底缓存:cache-control,Expires

      下面来简单理解一下这几个重要的协议头(HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。下文用的都是GMT

Last-Modified】

      有的页面内容分分钟改变,有的内容可能几周或者几月才改变,但是不变的是:服务器总是知道这些内容数据的修改事件,并且http为服务器提供了一种将最近修改数据连同请求的数据一同发送的方法。最近修改数据检查的具体流程如下:

      第一次向服务器发出请求是,服务器会反馈回来带有Last-modified:GMTtime头的response。当我们再次请求相同的数据时,我们发送的请求带上if-modified-since:GMTtimehttp 请求头,该请求头包含了上一次从服务器获取数据的日期。服务器用服务器本身所有的Last-modified时间与我们新发送的If-Modified-Since中包含时间比较,如果服务器上的数据从那时起没有变化,服务器将会返回一个http状态代码304,表示数据没变化,直接用你本地的缓存数据吧。

ETag】

      ETag与最近修改数据检查原理类似,其原理是:第一次向服务器发出请求是,服务器会反馈回来的response中不仅包含你所请求的数据,还包含某种数据的hash (在 ETag 头信息中给出)。这个hash 定完全取决于服务器。当再次请求相同的数据时,我们发送的请求包含 If-None-Match: 头信息,该头信息中包含 ETaghash,如果数据没有改变,服务器判断后将返回 304 状态代码。

PS:Etag和Last-modified的不同点就在于服务器要比较的值不同,Last-modified比较的是最近修改事件,Etag比较的是Hash值)

Expires】

      Expires指的是过期时间,特指的是缓存服务器上缓存的过期时间。缓存服务器就是存放频繁访问内容的服务器。Expires属性标明缓存器上的缓存数据在多长时间内是最新的,过了Expires设置的过期时间,缓存器内的缓存也就过期了,就需要重新向源服务器发送请求,检查数据是否被修改或者获取最新的数据。

Cache-Control】

      Expires的值是一个绝对时间,由服务器产生,但是这里有一个潜在的问题,即:源服务器和缓存服务器的时间未必会相同。要解决这个问题就要使用cache-control,它保存的是一个相对浏览器的时间。cache-control的优先级最高。我们主要了解一下Cache-Control的常用的cache-directive值:

   ①max-age=***表示缓存的内容将在***秒后失效,单位是秒。

   ②public :表示所有内容都将被缓存。(因为默认的是http认证过的内容才可以被缓存)

   ③private:表示内容只缓存到私有缓存中,即仅客户端可以缓存,缓存服务器也不可以。

   ④no-cache:表示强制每次的请求直接发送给源服务器,而不经过本地缓存版本的校验。也就是说,必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌(ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。

   ⑤no-store :表示强制不缓存任何内容,不缓存。

   ⑥must-revalidate和proxy-revalidate:表示如果缓存的内容失效,请求必须发送到服务器或者代理服务器进行重新验证。proxy-revalidate只对缓存代理服务器起作用。