浏览器 缓存与刷新 机制
2014-06-26 00:22
393 查看
来自:http://bbs.51cto.com/thread-941693-1.html
相信很多做网站的开发的朋友都有遇到过浏览器缓存的问题 为了及时看到修改的效果 F5光荣的成为了按下频率最高的键(至少我是这样的)而且是屡试不爽啊 ⋯⋯等等,有时候确实很不爽——如遇到缓存的时候
每当这个时候,要么Ctrl+F5,要么手动删除临时文件,甚至在网站里设置无缓存,可以说什么招都用上了,不过其原理倒是一直没有深究过
直到最近⋯⋯
暑假闲着,和朋友们合作一个微博的网站,我负责前端。由于这个站以后主要是做SEO,所以页面信息量和加载速度都得兼顾到位 于是经常用到 [Chrome浏览器审查元素里面的“Network”标签] 来监视页面加载过程
然后发现一个有趣的现象
1.从其他页面跳回某页面或者新打开这个页面的时候,如果有缓存,图片、css、js都不会下载而是直接使用缓存
2.在当前页面刷新时(无论是刷新还是强制刷新),所有通过html以及css加载的元素都会重新下载
3.(最神奇的一点)通过js加载的文件,只要缓存在,就没见它刷新过。
联想自己写php的时候,很多时候都会将缓存的有效时间设置为负值,以保证网站被修改时始终能“即时刷新”。
老实说我不知道我们这个网站有没有使用这一点,我也拿不准上面3条是不是通用的情况,于是我开始思考:
默认的浏览器缓存机制是怎么样呢?
到百度google一阵后,了改到浏览器是通过Last-Modified和Expires两种机制来处理缓存的
过期头 (Expires) 机制
Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存(无论是代理缓存还是用户代理缓存)返回,除非首先通过原始 服务器(或者拥有该实体的最新副本的中介缓存)验证。
就我这个俗人来点通俗一点的理解这个就是和cookies的有效期是类似的
控制文件是否有修改 Last-Modified/E-Tag 机制
Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,如果实体值在 Last-Modified 值之后没有被更改,则认为该缓存条目有效。ETag 响应头部字段值是一个实体标记,它提供一个 “不透明” 的缓存验证器。这可能在以下几种情况下提供更可靠的验证:不方便存储修改日期;HTTP
日期值的 one-second 解决方案不够用;或者原始服务器希望避免由于使用修改日期而导致的某些冲突。
一个不太形象也不太具象的比喻就是 验证文件的“希哈值”(比喻,比喻而已,非专业的)
然后了解在浏览器中各种刷新的响应机制:
F5:不允许浏览器直接使用本地缓存,因此Last-Modified能起作用,但Expires无效
Ctrl+F5:是强制刷新,因此缓存机制失效
“转至”或地址栏里回车:正常的访问,Last-Modified和Expires都有效
要想在了解具体一点?我不想再打字了,百度去吧
Ps:不生成缓存除了设置 http头外 加密内容和使用Post传输也不会生成缓存
来自:http://kb.cnblogs.com/page/165307/
浏览器缓存机制
浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires; Cache-control等)。但是也有非HTTP协议定义的缓存机制,如使用HTML
Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:
上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。
下面我主要介绍HTTP协议定义的缓存机制。
下面是宝宝PK项目中,浏览器拉取jquery.js web服务器的响应头:
注:Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date: Mon,31 Dec 2001 04:25:57GMT。
Web服务器告诉浏览器在2012-11-28 03:30:01这个时间点之前,可以使用缓存文件。发送请求的时间是2012-11-28 03:25:01,即缓存5分钟。
不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。
还是上面那个请求,web服务器返回的Cache-Control头的值为max-age=300,即5分钟(和上面的Expires时间一致,这个不是必须的)。
Last-Modified/If-Modified-Since要配合Cache-Control使用。
Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP
200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。
Etag/If-None-Match也要配合Cache-Control使用。
Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match(Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。
Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。
浏览器再次请求时:
相信很多做网站的开发的朋友都有遇到过浏览器缓存的问题 为了及时看到修改的效果 F5光荣的成为了按下频率最高的键(至少我是这样的)而且是屡试不爽啊 ⋯⋯等等,有时候确实很不爽——如遇到缓存的时候
每当这个时候,要么Ctrl+F5,要么手动删除临时文件,甚至在网站里设置无缓存,可以说什么招都用上了,不过其原理倒是一直没有深究过
直到最近⋯⋯
暑假闲着,和朋友们合作一个微博的网站,我负责前端。由于这个站以后主要是做SEO,所以页面信息量和加载速度都得兼顾到位 于是经常用到 [Chrome浏览器审查元素里面的“Network”标签] 来监视页面加载过程
然后发现一个有趣的现象
1.从其他页面跳回某页面或者新打开这个页面的时候,如果有缓存,图片、css、js都不会下载而是直接使用缓存
2.在当前页面刷新时(无论是刷新还是强制刷新),所有通过html以及css加载的元素都会重新下载
3.(最神奇的一点)通过js加载的文件,只要缓存在,就没见它刷新过。
联想自己写php的时候,很多时候都会将缓存的有效时间设置为负值,以保证网站被修改时始终能“即时刷新”。
老实说我不知道我们这个网站有没有使用这一点,我也拿不准上面3条是不是通用的情况,于是我开始思考:
默认的浏览器缓存机制是怎么样呢?
到百度google一阵后,了改到浏览器是通过Last-Modified和Expires两种机制来处理缓存的
过期头 (Expires) 机制
Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存(无论是代理缓存还是用户代理缓存)返回,除非首先通过原始 服务器(或者拥有该实体的最新副本的中介缓存)验证。
就我这个俗人来点通俗一点的理解这个就是和cookies的有效期是类似的
控制文件是否有修改 Last-Modified/E-Tag 机制
Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,如果实体值在 Last-Modified 值之后没有被更改,则认为该缓存条目有效。ETag 响应头部字段值是一个实体标记,它提供一个 “不透明” 的缓存验证器。这可能在以下几种情况下提供更可靠的验证:不方便存储修改日期;HTTP
日期值的 one-second 解决方案不够用;或者原始服务器希望避免由于使用修改日期而导致的某些冲突。
一个不太形象也不太具象的比喻就是 验证文件的“希哈值”(比喻,比喻而已,非专业的)
然后了解在浏览器中各种刷新的响应机制:
F5:不允许浏览器直接使用本地缓存,因此Last-Modified能起作用,但Expires无效
Ctrl+F5:是强制刷新,因此缓存机制失效
“转至”或地址栏里回车:正常的访问,Last-Modified和Expires都有效
要想在了解具体一点?我不想再打字了,百度去吧
Ps:不生成缓存除了设置 http头外 加密内容和使用Post传输也不会生成缓存
来自:http://kb.cnblogs.com/page/165307/
浏览器缓存机制
浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires; Cache-control等)。但是也有非HTTP协议定义的缓存机制,如使用HTML
Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。
下面我主要介绍HTTP协议定义的缓存机制。
Expires策略
Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。下面是宝宝PK项目中,浏览器拉取jquery.js web服务器的响应头:
注:Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date: Mon,31 Dec 2001 04:25:57GMT。
Web服务器告诉浏览器在2012-11-28 03:30:01这个时间点之前,可以使用缓存文件。发送请求的时间是2012-11-28 03:25:01,即缓存5分钟。
不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。
Cache-control策略(重点关注)
Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。http协议头Cache-Control: |
值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age 各个消息中的指令含义如下: Public指示响应可被任何缓存区缓存。 Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache指示请求或响应消息不能缓存 no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 |
Last-Modified/If-Modified-Since
Last-Modified/If-Modified-Since要配合Cache-Control使用。Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP
200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。
Etag/If-None-Match
Etag/If-None-Match也要配合Cache-Control使用。Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match(Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。
既生Last-Modified何生Etag?
你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。
用户行为与缓存
浏览器缓存行为还有用户的行为有关!!!用户操作 | Expires/Cache-Control | Last-Modified/Etag |
地址栏回车 | 有效 | 有效 |
页面链接跳转 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进、后退 | 有效 | 有效 |
F5刷新 | 无效 | 有效 |
Ctrl+F5刷新 | 无效 | 无效 |
总结
浏览器第一次请求:浏览器再次请求时:
相关文章推荐
- 浏览器的“刷新”&“缓存机制”
- 浏览器三种刷新方式所采取的缓存机制
- 浏览器刷新缓存机制
- 浏览器三种刷新方式的缓存机制-----单点登录SSO的实现原理---PHP版单点登陆实现方案
- 浏览器三种刷新方式所采取的缓存机制
- 浏览器的“刷新”&“缓存机制”
- 浏览器三种刷新方式采取的不同缓存机制
- 各种浏览器的缓存机制及相关问题的解决办法
- 浏览器返回键,刷新历史页面,从而清空缓存
- 浏览器缓存机制
- 【Web缓存机制概述】2 – Web浏览器的缓存机制
- 图片缓存:浏览器刷新 和 304 Not Modified 与 If-Modified-Since 及 Cache-Control
- Liferay 登录页面在浏览器选择后退,由于缓存不刷新的解决方案
- mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache
- 第7节 缓存和刷新机制
- 解决因浏览器缓存不刷新网页的问题
- 强制刷新浏览器调用的js和css以及js清除浏览器缓存的几种方法
- 浏览器缓存机制(转)
- 浏览器 HTTP 协议缓存机制详解
- [H5]浏览器缓存机制