Web前端-HTTP Cache-control

转载 2011年01月19日 18:26:00


    HTTP 协议分别在 1.0 / 1.1 两个时代推出了 Expires / Cache-control 两种 cache 策略,这里我们无需了解全部的细节,无需记住整个 RFC 内容

    但是当我们需要使用 HTTP cache 策略时,我们需要注意以下细节:

 

       Expires HTTP 1.0 那个时代的东西了,目前来看,可以不使用了,因为 HTTP 1.0 user agent 占有率在 0.1% 以下(我们主要面向的 web 浏览器均默认使用 HTTP 1.1

       Cache-control HTTP 1.1 的新特性,也是我们主要做文章使用 cache 策略的工具

 

       Cache 策略:

           #1 保鲜期 only

              这个是最最基础的一种策略,只需要在响应头中设定:

                  Cache-control: max-age=[secs]

              [secs] cache 在客户端存活的秒数,例如 Cache-control: max-age=1800 表明 cache 的时间是半小时

              只使用这样一个声明就可以使浏览器能够将这个 HTTP 响应的内容写入临时目录做 cache

 

              这里是简要过程:

                  I

(1) 浏览器第一次请求资源 http://test.qq.com/test.cgi

(2) 查询临时文件目录发现无 cache 存储,遂发出请求到 web server

(3) web server 响应资源,并设定 Cache-control:max-age=300

(4) 浏览器收到响应将资源呈献给用户的同时,在临时文件目录以 ”http://test.qq.com/test.cgi” key 缓存这个响应

---5 分钟内 ---

II

(1) 浏览器再一次请求资源 http://test.qq.com/test.cgi

(2) 查询临时文件目录发现存在 cache 存储,检查保鲜期 max-age ,还未过期,则直接读取之,响应给用户

---5 分钟后 ---

III

(1) 浏览器再一次请求资源 http://test.qq.com/test.cgi

(2) 查询临时文件目录发现存在 cache 存储,检查保鲜期 max-age ,已经过期,则发请求到 web server

 

 

 

#2 保鲜期 + 最后修改时间验证

    这里的要素是,在给出保鲜期的同时,给出一个资源的验证方式:

       Last-Modified: [UTC time]

    [UTC time] 标示这个响应资源的最后修改时间,例如 Last-Modified: Mon, 06 Jul 2009 09:21:48 GMT

    这个响应头只有配合 Cache-control 的时候才有实际价值,只是声明校验资源的方式,并不能影响资源的保鲜期时长

    利用资源的可校验性,我们可以实现在 cache 的资源超过保鲜期浏览器再次请求时的 304 响应,令浏览器再次使用之前的 cache

 

              这里是简要过程:

                  I

(1) #1 I (1)

(2) #1 I (2)

(3) web server 响应资源,并设定

Cache-control:max-age=300

Last-Modified: Mon, 06 Jul 2009 09:21:48 GMT

(4) #1 I (4)

---5 分钟内 ---

( #1 II)

---5 分钟后 ---

III

(1) 浏览器再一次请求资源 http://test.qq.com/test.cgi

(2) 查询临时文件目录发现存在 cache 存储,检查保鲜期 max-age ,已经过期

发现资源具有 Last-Modified 声明,则为请求带上头 If-Modified-Since: Mon, 06 Jul 2009 09:21:48 GMT

发送请求到 web server

(3) web server 收到请求后发现有头 If-Modified-Since 则与被请求资源的最后修改时间进行比对

若最后修改时间较新,说明资源又被改动过,则响应整片资源内容, HTTP 200 ( 需要整块内容写为包体 )

若最后修改时间较旧,说明资源无新修改,则响应 HTTP 304 ( 无需包体 ) ,告知浏览器继续使用所保存的 cache

( 这里当然也可以根据自己的需要决定是 200 还是 304 ,我们的 CGI 毕竟是一种原始的实现 )

 

 

           #3 保鲜期 + 自定义标识验证

    这里的要素是,在给出保鲜期的同时,给出另一种资源的验证方式:

       ETag: [custom flag]

    [custom flag] 标示这个响应资源的由开发者自己确定的签名验证标识 ,例如 ETag: "abcdefg"

    这个响应头只有配合 Cache-control 的时候才有实际价值,是声明校验资源的方式

    ETag 的使用为我们实现 304 响应提供了更多的灵活性,我们可以抛开必须将验证转化成时间格式的限制

 

              这里是简要过程:

                  I

(1) #1 I (1)

(2) #1 I (2)

(3) web server 响应资源,并设定

Cache-control:max-age=300

ETag: "abcdefg"

(4) #1 I (4)

---5 分钟内 ---

( #1 II)

---5 分钟后 ---

III

(1) 浏览器再一次请求资源 http://test.qq.com/test.cgi

(2) 查询临时文件目录发现存在 cache 存储,检查保鲜期 max-age ,已经过期

发现资源具有 ETag 声明,则为请求带上头 If-None-Match: "abcdefg"

发送请求到 web server

(3) web server 收到请求后发现有头 If-None-Match 则与被请求资源的相应校验串进行比对

可以是一个版本号,可以是短时间戳,可以是资源校验和 ( 强烈不推荐使用 ) ,或者干脆是一个常量 ( 可以干脆拿来做容错 )

 

If-None-Match 发来的串与我们的自有值比对,根据我们自己的任何策略算法,可以自由决定如何返回浏览器, 304 200

 

              这里有一个使用 ETag 来做容错的例子 ( 应用列表目前在使用 )

(1) 我们的每次正常返回都是

200

Cache-control: max-age=1800

ETag: "anything"

 

这里 anything 是个常量,我们只用来告诉浏览器, cache 过期要发带 If-None-Match 的请求过来

 

(2) 这样来自客户端的一大部分请求基本上都会带上 If-None-Match 头,我们的 CGI 据此可以知道这个请求的客户端是否有 cache

此时如果 CGI 联系 server 失败,那么可以直接返回 304 ,驱使客户端使用上一次 cache 的正确结果,且更新保鲜期 max-age 300

 

              这样我们实现了一个基于 HTTP cache 的容错,如果我们的资源还能实现一套时间戳存储的话

那么我们可以在正常情况下也实现校验后的 304 ,从而节省流量

这里还有一个比较惨的教训,国内 www 上都没有文献记载,全球业界也只有一点文献可以找到:

 

IE6 在资源有 gzip 压缩同时有 ETag 头时, cache 后再次发请求不会带 If-None-Match 头!!!

这个教训导致我们试图通过 304 减少 u.qzone.qq.com 流量的一次尝试失败 ( 当然我们能换一种方式实现 )

非常诡异,不中招是不知道的

相关文章推荐

http cache-control详解

  • 2010-11-28 20:41
  • 22KB
  • 下载

浅谈前端性能优化(一)——Expires和Cache-Control

前端性能优化中,减少HTTP请求可以提高页面的响应速度。 浏览器在第一次访问页面时向服务器请求资源,并缓存起来,下次再访问时会判断在缓存中是否已有该资源且有没有更新过,如果已有该资源且未更新过,则直接...

http cache-control

14.9 Cache-Control The Cache-Control general-header field is used to specify directives that ...

HTTP消息头中的“Cache-control”

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据...

【php】HTTP消息头中的“Cache-control”

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据...

HTTP头的Expires与Cache-control

1.概念 Cache-control用于控制HTTP缓存(在HTTP/1.0中可能部分没实现,仅仅实现了Pragma: no-cache) 数据包中的格式: Cache-Contro...

HTTP/1.1 Cache-Control的理解

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据...

HTTP消息头中的“Cache-control”介绍

转自:http://blog.sina.com.cn/s/blog_6ce2999701014whn.html 1. response.setHeader("Cache-Contro...

Http头介绍:Expires,Cache-Control,Last-Modified,ETag

转载自:http://www.51testing.com/html/28/116228-238337.html 缓存对于web开发有重要作用,尤其是大负荷web系统开发中。 缓存分很多种:...

HTTP头的Expires与Cache-control区别

HTTP头的Expires与Cache-control区别http://a18zhizao.com/y2010/1338_http-header-expires-and-cache-control.h...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)