浏览器缓存和304小结

时间:2014-04-03 11:56:36   收藏:0   阅读:480

关于浏览器缓存

浏览器的资源请求,如果使用了缓存基本上是两种情况

bubuko.com,布布扣

bubuko.com,布布扣

上面两种方式有什么区别呢?简单地说,第一种方式是不向浏览器发送请求,直接使用本地缓存文件。第二种方式,浏览器虽然发现了本地有该资源的缓存,但是不确定是否是最新的,于是想服务器询问,若服务器认为浏览器的缓存版本还可用,那么便会返回304。

浏览器关于缓存使用的决策

那么,浏览器如何决定是使用哪种方式呢?这就和服务器在请求返回中的Header字段有关了。下面对相关的字段进行简单介绍。

Cache-Control

Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。该字段通常覆盖默认缓存算法。另外,缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。

简单地说,该字段用于控制浏览器在什么情况下直接使用本地缓存而不向服务器发送请求。一般具有以下值:

其中最常用的属性便是 max-age, 这个字段很简单,就是浏览器在资源成功请求后的制定时间内,都将直接调用本地缓存和不会向服务器去请求数据。

Expires

Expires 头部字段提供一个日期和时间,在该日期前的所有对该资源的请求都会直接使用浏览器缓存而不用向服务器请求(注意:cache-control max-age 和 s-maxage 将覆盖 Expires 头部。)

Expires 字段接收以下格式的值:“Expires: Sun, 08 Nov 2009 03:37:26 GMT”。

但是使用Expires存在服务器端时间和浏览器时间不一致的问题。

Last-Modified/E-tag

Last-ModifiedE-tag的作用都是向服务器确认当前缓存文件是否为最新。抛开功能不看,这两个字段的表现如下:

那么上述是遵循了Http协议的浏览器会自动实现的,而要实现304的功能,就需要服务器(比如Apache对于静态资源会自动实现这两个字段的响应)或者我们手动在服务器端编写响应的逻辑来实现。

若同时使用了Last-ModifiedETag,正确的做法应该是当两者都符合条件时,才返回304

什么时候使用ETag?

Etag 主要为了解决 Last-Modified 无法解决的一些问题。

不同的页面打开方式产生的请求区别

一般我们打开(或者更新)一个页面(或者资源)有几种方式:

上面几种方式对资源的请求,会产生不同的结果,并且各浏览器的表现并不一致。具体的区别可以参考鸟哥的《浏览器缓存机制

其中大家需要注意的一点是,刷新页面(F5或者刷新按钮),不管是否设置了max-age,都会重新像服务器发送请求。但是这不影响304逻辑。

实例代码测试

nodejs写了一个简单的静态文件服务器,用来测试上面的Cache-ControlLast-Modified,具体代码可以看gist

例子比较简单,大体逻辑:

测试过程和结果:

需要注意的问题:


做了nodejs的实验之后,又开启了apache服务器,同样的将index.html和index.css文件放置到服务器根目录中,请求后,发现apache默认已经做了Last-ModifiedETag的处理,并且在修改index.css文件后,可以观察到这两个值的变化。

bubuko.com,布布扣

文章转载:   http://blog.sina.com.cn/s/blog_4b32835b0101crcb.html

浏览器缓存和304小结,布布扣,bubuko.com

原文:http://www.cnblogs.com/168dongze/p/3641416.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!