浏览器缓存
看了这篇文章后记录下自己的理解。
缓存有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和请求结果 。