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

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

[size=xx-large]Etag 是什么[/size]
Etag 是 HttpHeader 中代表资源的标签,在服务器端生成。如果带有 Etag ,下一次发送带 Etag 的请求,如果 Etag 没有变化将收到 304 的响应,从缓存中读取。
Etag 在使用时要注意相同资源多台 Web 服务器的 Etag 的一致性。

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

[size=xx-large]Cache-Control 是什么[/size]
no-cache 不缓存过期资源,缓存会向源服务器进行有效期确认后处理资源。
no-store 真正的不进行缓存。
s-maxage 代理服务器的缓存时间设置。
max-age 浏览器客户端缓存。
当max-age和Expire同时存在时,在HTTP/1.1里,优先处理max-age;在HTTP/1.0里,Expire的优先级更高。他和Expire的区别,一个是缓存时间段,一个是缓存时间点。

[size=xx-large]Last-Modified,Etag,Expire 混合[/size]
通常 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 响应。

[color=red][size=xx-large]注意[/size][/color]
如果在浏览器里,直接按F5或者刷新按钮,则会重新发请求,忽略expire和Cache-Control里的属性。
参考的英文
I got it. Google Chrome ignores the Cache-Control or Expires header if you make a request immediately after another request to the same URI in the same tab (by clicking the refresh button or pressing the F5 key). It probably has an algorithm to guess what does the user really want to do.
参考的文章
http://stackoverflow.com/questions/11245767/is-chrome-ignoring-control-cache-max-age

你可能感兴趣的:(http)