【转】浏览器缓存机制

既生Last-Modified何生Etag?

你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

l  Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间

l  如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

l  有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

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

既生Last-Modified何生Etag?

你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

l  Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间

l  如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

l  有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

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

Cache-control策略(重点关注)

Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于**Expires**。正规网赌平台 1

还是上面那个请求,web服务器返回的Cache-Control头的值为max-age=300,即5分钟(和上面的Expires时间一致,这个不是必须的)。

正规网赌平台 2

总结

浏览器第一次请求:

 正规网赌平台 3

浏览器再次请求时:

正规网赌平台 4 

 

 

 

补充:

用户行为和缓存除了作者说的六种方式之外还有两种:

用户操作

Expires/Cache-Control

Last-Modified/Etag

地址栏回车

有效

有效

页面链接跳转

有效

有效

新开窗口

有效

有效

前进、后退

有效

有效

F5刷新

无效

有效

Ctrl+F5刷新

无效

无效

刷新按钮

无效

无效

点击其他软件(QQ)打开页面 有效 有效

 

 Cache-Control 和 Expires

Expires 有个缺点,返回的到期时间是服务器端的时间,这样就会存在问题:如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP
1.1版开始,使用Cache-Control: max-age=秒替代。

正规网赌平台,Expires =max-age +   “每次下载时的当前的request时间”

所以一旦重新下载的页面后,expires就重新计算一次,但last-modified不会变化

引用别人做好的一个图来表示:

正规网赌平台 5

 

 

http://www.bkjia.com/Javascript/775886.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javascript/775886.htmlTechArticle最近在做页面分析的时候发现页面F5刷新时,大部分原来已经缓存的内容的状态变成了304,很是不解,原来想好好看看是什么原因的。结果

浏览器缓存机制

2015/12/01 · HTML5 ·
HTTP

原文出处:
吴秦   

浏览器缓存机制

浏览器缓存机制,其实主要就是**HTTP协议定义的缓存机制(如: Expires; Cache-control**等)。但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:正规网赌平台 6

上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。

下面我主要介绍HTTP协议定义的缓存机制。

Etag/If-None-Match

Etag/If-None-Match也要配合Cache-Control使用。

l  Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash**后得到的

l  If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match **(Etag**的值)web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304

用户行为与缓存

浏览器缓存行为还有用户的行为有关!!!正规网赌平台 7

总结

浏览器第一次请求:

正规网赌平台 8

浏览器再次请求时:

正规网赌平台 9

2 赞 12 收藏
评论

正规网赌平台 10

 

Expires策略

Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

下面是宝宝PK项目中,浏览器拉取jquery.js web服务器的响应头:

正规网赌平台 11

注: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,所以它的作用基本忽略。

Expires策略

Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

下面是宝宝PK项目中,浏览器拉取jquery.js web服务器的响应头:

正规网赌平台 12 

注: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,所以它的作用基本忽略。

相关文章