浏览器缓存相关的字段

设置浏览器缓存有下面几种方法

Last-Modified:服务器上文件的最后修改时间

Etag:文件标识

Expires:本地缓存目录中,文件过期的时间(由服务器指定具体的时间)

Cache-control:本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间)

为了提高性能,Yslow中也提到几条关于缓存的规则。

  1. 添加Expires或Cache-Control到报文头中。
  2. 配置ETags
  3. 让ajax可缓存

如何让浏览器缓存我们的静态资源,这也是一个需要由服务器和浏览器共同协作完成的事情。post、delete、put这类带行为性的请求操作一般不做任何缓存,大多数缓存只应用在get请求中。

简单来讲,本地没有文件时,浏览器必然会请求服务器端的内容,并将这部分内容放置在本地的某个缓存目录中。在第二次请求时,它将对本地文件进行检查,如果不能确定这份本地文件是否可以直接使用,它将会发起一次条件请求。所谓条件请求,就是在普通的GET请求报文中,附带if-modified-since字段,如下所示:

if-modified-since:Sun,03 Feb 2013 06:01:12 GMT

它将询问服务器端是否有更新的版本,本地文件的最后修改时间。如果服务器端没有新的版本,只需响应一个304状态码,客户端就是用本地版本。如果客户端有新的版本,就将新的内容发送给客户端,客户端放弃本地版本。

这里的条件请求采用时间戳的方式实现,但是时间戳有一定的缺陷存在。

  • 文件的时间戳改动但内容并不一定改动。
  • 时间戳只能精确到秒级别,更新频繁的内容将无法生效

为此HTTP1.1中引入了ETag来解决这个问题。ETag由服务器端生成,服务器端可以决定它的生成规则。

与if-modified-since/last-modified不同的是,ETag的请求和响应是if-none-match/ETag.

尽管条件请求可以在文件内容没有修改的情况下节省带宽,但是它依然会发起一个HTTP请求,使得客户端依然会花一定时间来等待响应。可见最好的方案就是连条件请求都不用发起。那么如何让浏览器知晓是否能直接使用本地版本呢?答案就是服务器端在响应内容时,让浏览器明确地将内容缓存起来。即在响应里设置Expires或Cache-Control头,浏览器将根据该值进行缓存。

那么这两个值有何区别呢?(Expires和Cache-Control)

HTTP1.0时,在服务器端设置Expires可以告知浏览器要缓存文件内容。Expires是一个GMT格式的时间字符串,浏览器在接到这个过期值后,只要本地还存在这个缓存文件,
在到期时间之前它都不会再发起请求。

但是Expires的缺陷是浏览器和服务器之间的时间可能不一致,这可能会带来一些问题,比如文件提前过期,或者到期后并没有删除。在这种情况下,Cache-Control以更丰富的形式,实现相同的功能。

Cache-Control比expires优秀的地方在于,Cache-Control能够避免浏览器端和服务器端时间不同步带来的不一致性问题,只要进行类似倒计时的方式计算过期时间即可。除此之外,cache-control的值还能设置public、private、no-cache、no-store等能够更精细地控制缓存的选项。

由于在HTTP1.0时还不支持max-age,如今的服务器在模块的支持下多半同时对expires和cache-control进行支持。在浏览器中如果两个值同时存在,且被同时支持时,max-age会覆盖expires

last-modified介绍

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是客户端请求的资源,同时有一个Last-Modified的属性标记此文件在服务器端最后被修改的时间

Last-Modified格式类似这样:

Last-Modified : Fri , 12 May 2006 18:53:33 GMT

客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头,询问该时间之后文件是否有被修改过:

If-Modified-Since : Fri , 12 May 2006 18:53:33 GMT

如果服务器端的资源没有变化,则自动返回 HTTP 304(Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

例子参考:http://www.cnblogs.com/zh2000g/archive/2010/03/22/1692002.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值