猫头哥的HTTP协议教程(六)HTTP协议缓存原理

Last-Modified是什么

Last-Modified是HttpHeader中的资源的最后修改时间,如果带有Last-Modified,下一次发送Http请求时,将会发生带If-modified-since的HttpHeader。如果没有过期,将会收到304的响应,从缓存中读取。

Etag是什么

Etag是HttpHeader中代表资源的标签,在服务器端生成。如果带有Etag,下一次发送带Etag的请求,如果Etag没有变化将收到304的响应,从缓存中读取。

Etag在使用时要注意相同资源多台Web服务器的Etag的一致性。

Expire是什么

Expire是HttpHeader中代表资源的过期时间,由服务器段设置。如果带有Expire,则在Expire过期前不会发生Http请求,直接从缓存中读取。用户强制F5例外。

Cache-Control是什么

no-cache不缓存过期资源,缓存会向源服务器进行有效期确认后处理资源。

no-store真正的不进行缓存。

s-maxage代理服务器的缓存时间设置。

max-age浏览器客户端缓存。

当max-age和Expire同时存在时,在HTTP/1.1里,优先处理max-age;在HTTP/1.0里,Expire的优先级更高。他和Expire的区别,一个是缓存时间段,一个是缓存时间点。

Last-Modified,Etag,Expire混合

通常Last-Modified,Etag,Expire是一起混合使用的,特别是Last-Modified和Expire经常一起使用,因为Expire可以让浏览器完全不发起Http请求,而当浏览器强制F5的时候又有Last-Modified,这样就很好的达到了浏览器段缓存的效果。

Etag和Expire一起使用时,先判断Expire,如果已经过期,再发起Http请求,如果Etag也过期,则返回200响应。如果Etag没有过期则返回304响应。

Last-Modified,Etag,Expires三个同时使用时。先判断Expire,然后发送Http请求,服务器先判断last-modified,再判断Etag,必须都没有过期,才能返回304响应。

注意

如果在浏览器里,直接按F5或者刷新按钮,则会重新发请求,忽略expire和Cache-Control里的属性。

参考的英文

Igotit.GoogleChromeignorestheCache-ControlorExpiresheaderifyoumakearequestimmediatelyafteranotherrequesttothesameURIinthesametab(byclickingtherefreshbuttonorpressingtheF5key).Itprobablyhasanalgorithmtoguesswhatdoestheuserreallywanttodo.

参考的文章

http://stackoverflow.com/questions/11245767/is-chrome-ignoring-control-cache-max-age

相关推荐