图片缓存:浏览器刷新 和 304 Not Modified 与 If-Modified-Since 及 Cache-Control

HealerJJJ 2011-12-08

今天在用chrome浏览淘宝页面的时候,发现很多来自淘宝图片HTTP状态码是304NotModified

到百度搜索了一下,明白了304状态的含义(以下绿色内容来自网络):

304NotModified:客户端有缓冲的文件并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

如果客户端在请求一个文件的时候,发现自己缓存的文件有LastModified,那么在请求中会包含IfModifiedSince,这个时间就是缓存文件的LastModified。因此,如果请求中包含IfModifiedSince,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回304还是200。对于静态文件,例如:CSS、图片,服务器会自动完成LastModified和IfModifiedSince的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含LastModified信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个200的请求。

我突然想起我所写的图片服务器没有实现HTTP304缓存功能。

这个304状态一般主要在用户刷新页面(F5键)的时候触发.

当用户在刷新页面的时候,因为原来的页面里的很多图片已经缓存过,客户端的浏览器已经记录了图片的最后更新时间(LastMod),所以在用户刷新页面的时候,会向服务器提交一个字段:If-Modified-Since:Wed,08Sep201021:35:06GMT

这个时候,服务器端的程序先取得这个字段的值,然后与服务器上的图片最后修改时间对比,如果相同,就直接返回304NotModified,然后停止。这样就不用把图片重新传输到客户端,达到节省带宽的目的。

关于Cache-Control:max-age=秒和Expires

Expires=时间,HTTP1.0版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)

max-age=秒,HTTP1.1版本,资源在本地缓存多少秒。

如果max-age和同时存在,则被Cache-Control的max-age覆盖。

Expires的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP1.1版开始,使用Cache-Control:max-age=秒替代。

今天我还发现一个小的问题,是关于客户端的日期格式:

Wed,08Sep201021:35:06GMT与Wed,8Sep201021:35:06GMT

注意上面的格式,一个是8的前面有个前置的0,一个没有。

我发现firefox和chrome对这个日期格式处理一致,ie有点不同。

最终我修改了服务器端的程序:

//HTTP日期格式:Wed,08Sep201021:35:06GMT

DateFormatdateFormatGMT=newSimpleDateFormat("EEE,ddMMMyyyyHH:mm:ssz",Locale.ENGLISH);//时间格式

相关推荐