expire和etag,last-modified的优先级问题

当再次访问网站时,上次访问留存有expire和etag,last-modified,浏览器是如何处理的?
expire在有效期内,是否还发出http请求?
如果不发出http请求了,服务器资源更新了,还是从浏览器缓存取了旧资源吗?
如果还发http请求,那由etag和last-modified来判断资源是否更新,好像expire的意义不明。

就是概括说一下浏览器的判断处理和服务器的交互流程,谢谢

阅读 8.3k
1 个回答

Expires 已经没啥用了,更多的是为了兼容旧浏览器(只支持 HTTP/1.0 的上古时代浏览器)的响应标头。

从 HTTP/1.1 以后就有了 Cache-Control 标头中的 max-age,与上者几乎等效,也就是设值有所不同,前者是设一个具体的时间点、后者是设一个秒数。但显然 Expires 可能因为客户端与服务端时间不一致、或网络延迟导致过期时间不准确,并且 Cache-Control 能设的值更多也就更灵活。

如果两者同时存在,以 Cache-Control 为准。


如果同时设了 ETagLast-Modified,那么必须同时满足条件才会 304,不存在谁更优先就使用谁一说。

但一般分布式环境下(比如 CDN)很少使用 ETag,因为 ETag 依赖 Web Server 的哈希算法,不同 Web Server、不同版本、不同的配置,都会导致同样的文件 ETag 可能是不相等的。当然了,如果你能限制上述信息都一样,也可以使用 ETag,并不绝对。


顺序的话是先判断 Cache-ControlExpires,再 ETag,最后 Last-Modified,都满足就 304,有一项不满足就 200。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏