相关代码如下:
const string MaxAgeString = "max-age"; // TimeSpan? const string MaxStaleString = "max-stale"; // bool const string MinFreshString = "min-fresh"; // TimeSpan? const string MustRevalidateString = "must-revalidate"; // bool const string NoCacheString = "no-cache"; // bool const string NoStoreString = "no-store"; // bool const string NoTransformString = "no-transform"; // bool const string OnlyIfCachedString = "only-if-cached"; // bool const string PrivateString = "private"; // bool const string ProxyRevalidateString = "proxy-revalidate"; // bool const string PublicString = "public"; // bool const string SharedMaxAgeString = "s-maxage"; // TimeSpan? --SharedMaxAge
|
CacheControl |
|
Description |
|
max-age |
|
缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应 |
|
max-stale |
|
指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 |
|
min-fresh |
(仅为请求标头) |
指示客户机可以接收响应时间小于当前时间加上指定时间的响应 |
|
must-revalidate |
(仅为响应标头) |
如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证 |
no-cache |
|
示请求或响应消息不能缓存 |
no-store |
|
所有内容都不会被缓存到缓存或 Internet 临时文件中 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存; |
no-transform |
|
请求:告知代理,不要更改媒体类型,比如jpg,被你改成png. |
only-if-cached |
(仅为请求标头) |
(仅为请求标头)请求:告知缓存者,我希望内容来自缓存,我并不关心被缓存响应,是否是新鲜的.
|
private |
(仅为响应标头) |
指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效; :告知缓存者(据我所知,是指用户代理,常见浏览器的本地缓存.用户也是指,系统用户.但也许,不应排除,某些网关,可以识别每个终端用户的 情况),只针对单个用户缓存响应. 且可以具体指定某个字段.如private –“username”,则响应头中,名为username的标头内容,不会被共享缓存. |
proxy-revalidate |
(仅为响应标头) |
限制上与must-revalidate类似.区别在于受体的范围.proxy-revalidate,是要排除掉用户代理的缓存的.即,其规则并不应用于用户代理的本地缓存上. |
public |
(仅为响应标头) |
指示响应可被任何缓存区缓存 |
s-maxage |
|
响应:与max-age的唯一区别是,s-maxage仅仅应用于共享缓存.而不引用于用户代理的本地缓存,等针对单用户的缓存. 另外,s-maxage的优先级要高于max-age |
其作用根据不同的重新浏览方式分为以下几种情况:
(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临时文件夹中查看临时文件的属性看到的。
Cache-Control: no-cache
使用了这个响应头的页面不会保存在缓存里,IE总会重新从服务器加载;即使你使用后退按钮.下面这个例子使用HttpWatch监听一个网上商店,当我们在提交订单表单后点击后退按钮,结果如下图:
然而,这个响应头却不能防止Firefox的缓存.这意味着,Firefox在正常访问的情况下,将一直使用缓存的页面,直到它发送GET请求重新检验.并且,如果是通过后退按钮访问页面,Firefox不会再次访问服务器,而是简单直接地从缓存加载.
那怎样才能关掉Firefox中的缓存呢? 答案很简单,关不了. 因为Firefox依靠缓存中的副本为"文件->另存为","查看源代码"这样的操作服务.但是,你可以控制页面缓存到哪里及那些缓存条目可以用于显示.
下面响应头在Firefox中可以防止持久化的缓存,强制页面被缓存到内存中:
Cache-Control:no-store
这个头也可以防止使用后退按钮时访问了缓存页面,它将触发一个HTTP GET请求.
这两个响应头的值组合使用可以在IE与Firefox得到期待的结果:
Cache-Control: no-cache, no-store
如下HttpWatch响应头标签所示:
Pragma: no-cache:跟Cache-Control: no-cache相同,Pragma: no-cache兼容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。因此,Pragma: no-cache可以应用到http 1.0 和http 1.1,而Cache-Control: no-cache只能应用于http 1.1


浙公网安备 33010602011771号