Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1044695
  • 博文数量: 157
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1388
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-09 15:37
文章分类

全部博文(157)

文章存档

2023年(9)

2022年(2)

2021年(18)

2020年(7)

2017年(13)

2016年(53)

2015年(55)

我的朋友

分类: 网络与安全

2016-01-08 10:41:41

转载于:http://blog.csdn.net/kkdelta/article/details/16985769

Expires、Cache-Control、Last-Modified、ETag都是在http response的返回header中
用来控制浏览器客户端缓存行为的。
1.Expires在HTTP/1.0中已经定义,Cache-Control:max-age=xxx在HTTP/1.1中才有定义,
为了向下兼容,仅使用max-age不够。
当某一个web资源被访问后,会被浏览器缓存,在以后对相同资源再次访问的时候浏览器会
检查缓存是否过期。
Expires指定的值为日期,在指定的日期到达之前再次访问则认为缓存有效。
max-age指定的值为多少秒,距第一次访问多少秒后再次访问则认为缓存有效。
这时候是不会发生网络请求的。
场景:1,用户在浏览器里输入一个曾经访问过的网址,2,点击URL link(href)链接到一个曾经访问
过的资源。3,网页中静态的JS,CSS,图片资源。

Last-Modified的值为一个日期,是资源最近一次修改的时间。
ETag的值为服务器对请求的资源的内容按照hash算法计算的一个值,当内容
发生改变的时候,这个值会相应的改变。

Expires和Cache-Control控制浏览器是否做缓存,如果缓存,缓存的有效期为多久。Expires值为-1和0不缓存。Cache-Control的值为no-cache不缓存.
Last-Modified和ETag是在缓存过期后到服务器做验证的时候的比较值。Last-Modified只能精确到秒级别,如果要到毫秒级别,就要用ETag.

当缓存过期后,浏览器会向服务器发送请求。
这时候request header会带上If-Modified-Since和If-None-Match参数。
If-Modified-Since的值为缓存中最初收到的Last-Modified的值。
If-None-Match的值为缓存中最初收到的ETag的值。
如果最初的返回中没有Last-Modified和ETag的值则不会带上这个请求参数。
服务器收到后会“验证”,如果相同则返回一个“304 Not Modified”响应,
不会将内容再传一次,节省了带宽。
场景:1,访问的时间在Expires日期之后或者max-age指定的时间之后,2,用户按F5刷新.

还有一种情况是用户按 CTRL+F5,这时候浏览器会在请求头中带上
Pragma参数,值为no-cache,同时在request header中去掉If-Modified-Since和If-None-Match。
服务器收到请求后会将内容重新传给浏览器,不管内容是否变化,就像是浏览器第一次请求一样。
响应码是200 ok。

下面是在JAVA代码中设置这些参数的方法:
//不允许浏览器端或缓存服务器缓存当前页面信息。    
response.setDateHeader("Expires", 0);  
response.addHeader( "Cache-Control", "no-cache" );
//本页面允许在浏览器端或缓存服务器中缓存,时限为10秒。
java.util.Date date = new java.util.Date();  
response.setDateHeader("Expires",date.getTime()+10000); 
response.addHeader( "Cache-Control", "max-age=10" ); 
//设置修改时间
response.setDateHeader("Last-Modified",date.getTime());

在nginx中实验,nginx可以通过expires 或者add_header配置来为
response header添加 Expires和Cache-Control参数。
默认不指定的时候,response header如下,没有Expires和Cache-Control参数。
这时候默认有Last-Modified和Etag值,多次访问不会发生网络请求。
Connection    keep-alive
Date    Wed, 27 Nov 2013 05:17:24 GMT
Etag    "52957fcb-37"
Last-Modified    Wed, 27 Nov 2013 05:14:51 GMT
Server    nginx/1.5.7
nginx指定expires -1d,意思是过期时间为一天前。
这时候每次再次访问相同资源都会到服务器"验证",然后得到一个304返回.
Cache-Control    no-cache
Connection    keep-alive
Date    Wed, 27 Nov 2013 06:52:20 GMT
Etag    "5295898b-b6"
Expires    Tue, 26 Nov 2013 06:52:20 GMT
Last-Modified    Wed, 27 Nov 2013 05:56:27 GMT
Server    nginx/1.5.7
nginx指定expires 1d,意思是过期时间为一天后。
这时候每次再次访问相同资源,浏览器不会像服务器发请求。
这时候如果资源内容有改变,浏览器也不会知道。

当然如果你F5或者CTRL+F5可以看到最新的内容。

Cache-Control还可以设置的其它值:

阅读(1055) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~