浏览器缓存

2019-03-12  本文已影响0人  广告位招租

为什么要缓存

浏览器缓存的控制

1. 使用meta标签

<meta http-equiv="Pragma" content="no-cache"> 

缺点:

  1. 仅有IE才能识别这段meta标签含义,其它主流浏览器仅识别“Cache-Control: no-store”的meta标签。
  2. 在IE中识别到该meta标签含义,并不一定会在请求字段加上Pragma,但的确会让当前页面每次都发新请求(仅限页面,页面上的资源则不受影响)。

2. 使用缓存有关的HTTP消息报头

消息报头 内容
Pragma no-cache 告诉浏览器忽略资源的缓存副本,每次访问都需要去服务器拉取【http1.0中存在的字段,在http1.1已被抛弃,使用Cache-Control替代,但为了做http协议的向下兼容,很多网站依旧会带上这个字段】
Expires Mon, 15 Aug 2016 03:56:47 GMT 启用缓存和定义缓存时间。告诉浏览器资源缓存过期时间,如果还没过该时间点则不发请求【http1.0中存在的字段,该字段所定义的缓存时间是相对服务器上的时间而言的,如果客户端上的时间跟服务器上的时间不一致(特别是用户修改了自己电脑的系统时间),那缓存时间可能就没啥意义了。在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代】
Cache-Control no-cache 告诉浏览器忽略资源的缓存副本,强制每次请求直接发送给服务器,拉取资源,但不是“不缓存”
Cache-Control no-store 强制缓存在任何情况下都不要保留任何副本
Cache-Control max-age=[秒] 指明缓存副本的有效时长,从请求时间开始到过期时间之间的秒数
Cache-Control public 任何路径的缓存者(本地缓存、代理服务器),可以无条件的缓存改资源
Cache-Control private 只针对单个用户或者实体(不同用户、窗口)缓存资源
Last-Modified Mon, 15 Aug 2016 03:56:47 GMT 告诉浏览器这个资源最后的修改时间。服务器将资源传递给客户端时,会将资源最后更改的时间以“Last-Modified: GMT”的形式加在实体首部上一起返回给客户端【只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间】
If-Modified-Since Mon, 15 Aug 2016 03:56:47 GMT 其值为上次响应头的Last-Modified值,再次向web服务器请求时带上头If-Modified-Since。web服务器收到请求后发现有头If-Modified-Since则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),包括更新Last-Modified的值,HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304(无需包体,节省浏览),告知浏览器继续使用所保存的cache
ETag "fd56273325a2114818df4f29a628226d" 告诉浏览器当前资源在服务器的唯一标识符(生成规则又服务器决定)
If-None-Match "fd56273325a2114818df4f29a628226d" 当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match(Etag的值)。web服务器收到请求后发现有头If-None-Match则与被请求资源的相应校验串进行比对,决定返回200或304

有关不同消息报头的不同字段之间的关系和区别

  1. Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的新鲜度
  2. 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
  3. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

image.png

F5刷新和ctrl + F5刷新有什么区别

浏览器输入 url 之后敲下回车就是先看本地 cache-control、expires 的情况,刷新(F5)就是忽略先看本地 cache-control、expires 的情况,带上条件 If-None-Match、If-Modified-Since,强制刷新(Ctrl + F5)就是不带条件的访问

如果比较粗的说先后顺序应该是这样:

  1. 如果同时有 etag 和 last-modified 存在,在发送请求的时候会一次性的发送给服务器,Etag的优先级高
  2. 如果expires和cache-control:max-age同时存在,expires会被cache-control 覆盖。
  3. 其中Expires和cache-control属于强缓存,last-modified和etag属于协商缓存 强缓存与协商缓存区别:强缓存不发请求到服务器,协商缓存会发请求到服务器

详情请访问(https://www.cnblogs.com/slly/p/6732749.html

上一篇 下一篇

猜你喜欢

热点阅读