web页面缓存之Cache-Control问题

来源:互联网 发布:吓人软件 编辑:程序博客网 时间:2024/05/17 05:01

Cache-Control是HTTP协议的一部分,是在请求和响应中必须服从的指令,通常用于提高页面加载,阻止页面缓存对请求和响应造成不利的干扰。

Cache-Control 为单向指令,即请求中存在的指令,并不意味着响应中存在同样的指令

客户端对请求的处理(请求头设置的Cache-Control):

Web浏览器都有Refresh(刷新)和Reload(重载)按钮,可以强制对浏览器或者代理缓存,进行刷新

Refresh的特性取决于特定的浏览器、文档以及拦截缓存的配置。可以通过下面的指令来强化客户端的缓存配置

请求中Cache-Control指令指令目的Cache-Control:max-stale=<s>缓存可随意提供过期文件,如果指定了参数<s> 在这段时间内,文档不能过期Cache-Control:max-age=<s>缓存无法返回缓存时间大于<s>秒的文件,这条指令使得缓存更加严格Cache-Control:no-cache除非资源进行了再验证,否则客户端不会接受已经缓存的资源Cache-Control:no-store缓存尽快从存储器中删除资源痕迹Cache-Control:only-if-cached当缓存中有副本文件存在才,客户端才会获取副本








服务器对Cache-Control的配置:

响应的Cache-Control指令指令说明public所有内容都被缓存private仅客户端缓存代理服务器不缓存no-cache必须先与代理服务器确认是否更改,然后在在决定使用缓存还是请求no-store所有内容都不会被缓存must-revalidation/proxy-revalidation如果缓存内容失效,请求必须发送服务器/代理进行验证max-age=<s>缓存内容在s秒后失效,仅HTTP1.1可用
对于上述配置浏览器的响应为:

浏览器对于Cache-Control的响应指令打开新窗口原窗口单击Enter按钮刷新点击返回按钮public缓存页面缓存页面重新请求页面缓存页面private重新请求第一次请求,随后缓存重新请求页面缓存页面no-cache/no-store重新请求重新请求重新请求缓存页面must-revalidation/proxy-revalidation浏览器重新请求第一次请求,随后缓存重新请求缓存页面max-age=xxx在XX秒后重新请求在XX秒后重新请求重新请求在xx秒后重新请求

设置缓存之后客户端的请求:

HTTP中expires为绝对过期时间,过期时间过期了,说明缓存已过期,max-age定义了请求返回数据中最大使用使用期。

定义了max-age之后,缓存的内容不一定每次都与服务器来进行验证,但是在过期时间到期之后。一定会与服务器验证。

HTTP条件方法可以实现高效的再验证,向服务发送 “ 条件GET ” 目前最常用的为  If-Modified-Since:Date  If-None-Math:ETag(实体标签,版本标识)

If-Modified-Since 表示在指定日期之后资源被更新,就返回新的请求,如果指定日期未更新就返回304直接读取缓存

If-None-Math 有的文档有可能周期性的被重写,通过ETag 来确保文档是否改变,改变返回请求状态为200的新资源,未改变返回状态码304直接读取缓存

这些可以结合使用。

缓存的内容不一定每次都与服务器来进行验证,不同的浏览器对于请求中Cache-Control的值和响应中Cache-Control的值的优先级是不一样的。以下为设置了max-age之后的请求

在资源未失效的情况下,用户打开浏览器窗口。读取缓存的浏览器有
  • win8.1 firefox55 Gecko55.0
  • Win7  chrome47 webkit 537.36
  • Win7 chrome 45 webkit 537.36  45.0.2454.101
  • Win10 chrome 48 webkit 537.36
  • Win7 chrome 58 webkit 537.36
  • Mac OS 10.12.6 safari10 webkit 603.38
  • winXP chrome55 webkit 537.36   55.0.2883.87
  • Win7 Maxthon4 4.9.5.1000 webkit537.36
以上浏览器为实测测试。不包括全部



原创粉丝点击