关于浏览器的缓存,有了Etag,last-Modified还有必要存在吗???

Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返…
关注者
93
被浏览
28,086

6 个回答

你的理解和图都错了。

图上说的「Etag? -> 否」是指没有 ETag,而不是 ETag 不同。

而图上的错误则是,RFC 规定,如果 ETag 和 Last-Modified 都有,则必须一次性都发给服务器,没有优先级。

最后,如果服务器输出了 ETag,没有必要再输出 Last-Modified。

我也是Ted

:Etag是lastModifed的补充,有些动态生成的内容就可以用hash做etag控制缓存了

生成Etag是需要后台写一个算法生成的,比如取文件的hashCode或MD5,多一点运算。

取文件的lastModified更快,并且是web服务器自动支持的。默认使用lastModified,有需要的情况下才用Etag,什么是有需要的情况?下面提供一个场景:

同一url的资源,在不同条件下返回不同的内容

一个后台管理系统,提供换肤功能,当皮肤从“质感”换到“扁平”时,实际上是切换了一个css,页面上大部分控件的样式都改变了,变为了“扁平”风格,

但发现<img>标签引入的图片没有被css调整为"扁平"风格的,

如:界面左上角的logo图,界面右上角的默认头像,图片404错误的替代图,某几个icon……

怎么让这些图片换掉?我们的做法是

后台对特定路径的图片资源的访问进行监听,根据当前选择的皮肤返回不同的图片。

同是<img src="resources/404.png"/>

在“质感”皮肤下,返回的是服务器上 /web/zcms/resources/raised/404.png

在“扁平”皮肤下,返回的是服务器上 /web/zcms/resources/flat/404.png

既然对浏览器来说图片路径没有变化,那是不是直接在缓存里取出来就成了?换扶效果还能完成吗?

这时候就要祭出Etag,将图片文件的hashCode作为Etag值返回。raised/404.png 和 flat/404.png 的hashCode是不同的,换肤后浏览器一看resources/404.png文件头里Etag和缓存的不一样,就知道不能用缓存里的了,要去服务器上取新的图片。