1 最后由 cz (2014-10-08 14:06:30) 编辑

主题: http Cache-control 缓存控制

Cache-Control头域
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括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消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
综述:
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。网页的缓存通过HTTP消息头中的“Cache-control”来控制,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。

其作用根据不同的重新浏览方式分为以下几种情况:
(1)打开新窗口如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如: Cache-control: max-age=5 表示当访问此网页后的5秒内再次访问不会去服务器。
(2)在地址栏回车如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
(3)按后退按扭如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问。
(4) 按刷新按扭无论为何值,都会重复访问当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。另外,通过指定“Expires”值也会影响到缓存。例如,指定Expires值为一个早已过去的时间,那么访问此网时若重复在地址栏按回车,那么每次都会重复访问: Expires: Fri, 31 Dec 1999 16:00:00 GMT 在ASP中,可以通过Response对象的Expires、ExpiresAbsolute属性控制Expires值;通过Response对象的CacheControl属性控制Cache-control的值,例如: Response.ExpiresAbsolute = #2000-1-1# ' 指定绝对的过期时间,这个时间用的是服务器当地时间,会被自动转换为GMT时间 Response.Expires = 20 ' 指定相对的过期时间,以分钟为单位,表示从当前时间起过多少分钟过期。 Response.CacheControl = "no-cache" Expires值是可以通过在Internet临时文件夹中查看临时文件的属性看到的。

---------------------

no-cache/must-revalidate/no-store
客户端从服务器请求数据经历如下基本步骤:
  1、如果请求命中本地缓存则从本地缓存中获取一个对应资源的"copy";
  2、检查这个"copy"是否fresh,是则直接返回,否则继续向服务器转发请求。
  3、服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。
  4、客户端更新本地缓存。
  no-cache的作用是:强制客户端跳过步骤2,直接向服务器发送请求。也就是说每次请求都必须向服务器发送。
  must-revalidate:作用与no-cache相同,但更严格,强制意味更明显。但这只是理论上的描述,根据我在ff6上的测试,它几乎不起作用:只要请求的频率加快到一定程度,服务器就接收不到请求。
  no-store:缓存将不存储response,包括header和body。测试结果表明,除每次请求都必发送到服务器外,响应代码均是200,且request并没有发送"If-Modified-Since"和"If-None-Match"头,这意味着缓存的确没有存储response。
  以上三者都是要求客户端每次请求都必须到服务器进行revalidate,此功能还可以通过max-age实现:


Cache-Control:max-age=0 
测试结果证明了这一点,每次都请求了服务器,且状态码是304。


<META HTTP-EQUIV="Cache-control" CONTENT="no-cache"> 

这种设置方式大部分服务器不支持,额外的解析成本、只支持html文件等原因造成的结果是,它基本上是无效的。

==============================

etag If-None-Match / Last-Modified If-Modified-Since
ETag和Last-Modified用法上的区别是:ETag必须由开发人员来使用,而Last-Modified服务器会自动判断。也就是说服务器自己能够获取文件的"Last-Modified"并和"If-Modify-Since"进行对比,进而决定发送什么样的响应。而ETag则必须由开发人员自己来和"If-None-Match"进行比较判断。
     加上ETag一个用途是,假如文件被编辑了,但实际上内容并没有变化,此时可以指定ETag的值不变,这样它和浏览器发送过来的"If-None-Match"的值就相等了,进而可以指定响应为304,即未发生改变。如果不加ETag这个功能,则浏览器会发送200响应。

==============================

max-age
假如请求了服务器并在a时刻返回响应结果,则在max-age规定的秒数内,浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。

回复: http Cache-control 缓存控制

一般浏览器访问动作以及按F5刷新都遵循缓存规则
而Ctrl+F5则忽略缓存规则强制刷新

回复: http Cache-control 缓存控制

返回304 Not Modified时

request  的  If-Modified-Since:Tue, 05 Aug 2014 16:02:15 GMT
对应  response  的  Last-Modified:Tue, 05 Aug 2014 16:02:15 GMT

request  的  If-None-Match:"53e10007-264"
对应  response  的  ETag:"53e10007-264"

回复: http Cache-control 缓存控制

Ctrl + F5 刷新时  request 没有If-Modified-Since和If-None-Match字段,而是添加了Cache-Control:no-cache 和 Pragma:no-cache