说一说浏览器缓存

Posted 锋戈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说一说浏览器缓存相关的知识,希望对你有一定的参考价值。

  缓存的问题一直都是我们比较头痛的问题,为了提高网站响应速度,减少服务器的负担,和节省带宽,将需要将静态资源缓存在客户端,

但是有些时候,当这些文件有更新的时候,我们又希望这些缓存能够尽快失效。所以怎么很好的利用缓存功能,而又不影响我们的正常更新。 
了解这些缓存机制,就非常有必要。

  浏览器通过URL地址访问一个网页时,浏览器会自动缓存用户访问过网站的网页,当用户下一次在访问这个页面的时候,浏览器就会跟自己本地缓存的页面进行比较
如果网页没有更新的话,浏览器就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。

  HTTP 缓存相关的几个重要的Header

  Cache-Control

  Cache-Control 这是HTTP缓存最重要的头部字段,用于指定所有缓存机制在整个请求 / 响应 中必须服从的命令。
  cache-control 的定义是:Cache-Control = “Cache-Control”

  public 所有内容都将被缓存 
  private 内容只缓存到私有缓存中 
  no-cache 所有内容都不会被缓存 
  no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中 
  must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器 / 代理以进行重新验证 
  max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效 , 这个选项只在 HTTP 1.1 可用 , 并如果和 Last-Modified 一起使用时 , 优先级较高

  Cache-Control 是关于浏览器缓存的最重要的设置,因为它覆盖其他设置,比如 Expires 和 Last-Modified 。另外,由于浏览器的行为基本相同,这个属性是处理跨浏览器缓存问题的最有效的方法。

  Expires
  Expires 头部字段提供一个日期和时间,响应在该日期和时间之后被认为缓存失效。失效的缓存条目通常不会被浏览器返回。
  Expires 的定义是 “Expires: Sun, 08 Nov 2009 03:37:26 GMT”。如果查看内容时的日期在给定的日期之前,则认为该内容没有失效并从缓存中提取出来。反之,则认为该内容失效,缓存将采取一些措施。
  注意:cache-control max-age 和 s-maxage 将覆盖 Expires 头部。

  Last-Modified/E-Tag 
  Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,
内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:Last-Modified: Fri, 12 May 2006 18:53:33 GMT ,当第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:如果服务器端的资源没有变化,则返回 HTTP 304 (Not Changed.)状态码。而不是响应的文件。

  ETag 是根据web资源生成的一段hash字符串。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,当资源发送改变时,ETag也随之发生变化
以下是服务器端返回的格式:
  ETag: "50b1c1d4f775c61:df3"
  客户端的查询更新格式是这样的:
  If-None-Match: W/"50b1c1d4f775c61:df3"
  如果ETag没改变,则返回状态304,这也和Last-Modified一样。

以上是关于说一说浏览器缓存的主要内容,如果未能解决你的问题,请参考以下文章

说一说从输入URL到页面呈现都发生了什么?

说一说javascript跨域和jsonp

java基础—java内存模型(JMM)CPU架构缓存一致性重排序JMM的实现JMM保证可见性有序性问题的详解

灵魂拷问第2篇:能不能说一说浏览器的本地存储?各自优劣如何?

灵魂拷问第4篇:说一说从输入URL到页面呈现发生了什么?——解析算法篇

灵魂拷问第7篇:能不能说一说XSS攻击?