浏览器缓存

看了 这篇文章后记录下自己的理解。

缓存有2步:强制缓存和协商缓存。就是通过一些手段,设置强制缓存,让文件保存在本地硬盘,当强制缓存失效后,再通过与服务器协商看是否更新缓存文件。

强制缓存 #

强制缓存会把文件缓存在本地,当缓存未过期时访问网站,浏览器会直接使用缓存的资源。

控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。

Expires是过时的方式,不推荐使用。推荐使用Cache-Control来控制。

Cache-Control用的多的值是如下几个:

  • public:(强制缓存)所有内容都将被缓存(客户端和代理服务器都可缓存)
  • private:
    (强制缓存) 所有内容只有客户端可以缓存,Cache-Control的默认取值
  • no-cache:(协商缓存)客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
  • no-store:(决定不使用缓存)所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
  • max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

协商缓存 #

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。

缓存标识是响应报文的HTTP头中和请求结果一起返回给浏览器的。

缓存标识有2组:

  • 【Last-Modified / If-Modified-Since 】
  • 【Etag / If-None-Match】

【Etag / If-None-Match】优先级较高。

Last-Modified / If-Modified-Since #

Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间。

If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值。服务器通过比较这个值判断缓存是否失效。

协商缓存生效,返回304,浏览器使用缓存。

协商缓存失效,返回200和请求结果 。

Etag / If-None-Match #

Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)。

If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值。服务器通过比较这个值判断缓存是否失效。

协商缓存生效,返回304,浏览器使用缓存。

协商缓存失效,返回200和请求结果 。