HTTP缓存的疑问?

今日学习HTTP缓存有些疑问,望各位大佬解答。

  1. 强缓存。 cache-control 设置 max-age 是一个数量值,那么客户端去缓存如何判断过期呢?因为要知道资源最后有效的截止日期, 是结合 header 的 Date 字段判断?还是说 Http 自己有一套 算法/规则 会去清理过期的资源,当过期后再去取时没找到就重新请求?
  2. 协商缓存。二次请求时,网上都说从本地拿取标识去和服务器做核对?这个表示我理解其实就是 Http 的相应字段值嘛(Last-Modified / Etag),那么本地是存的整个 header 还是说仅仅是该字段?另外在发标识请求这个过程,请求只携带 header 而没有body(换句话就是:304请求值携带header?)
  3. 本地将资源缓存、获取本地标识向服务器请求这两件事(谁在操作本地的空间)网上都说是客户端完成的,对吗?还是说是 http协议 去做的?

以上三个问题,可能需要多了解一些http了,如果没有回答,我后面来自答!

阅读 2k
3 个回答
  1. max-age是指客户端接收到响应之后N秒过期,下次请求的时候看下有没有超过这个时间就知道是否过期了,没过期走缓存,过期重新请求。
  2. 所有请求都会携带header。不存在所谓“304请求”的说法,304是响应的状态码,是服务端响应给客户端的,请求的时候是不可能预先知道状态码的,所以都是带着header去请求,服务端再根据过来的请求做判断,然后做不同的响应。
  3. 是客户端根据HTTP协议去实现的。HTTP只是协议,规定该怎么做,客户端是具体实现。

不管是强缓存还是协商缓存是由HTTP协议来处理的,但HTTP协议毕竟只是协议,她只是一个规范/规定。
实际和服务端的交互还是由浏览器来实现的,以及缓存的管理之类的功能(缓存是否过期,以及你提到的的Last-ModifiedETag 这些和协商缓存相关的字段)。

所以浏览器不支持协商缓存的话(不支持新的HTTP协议规范),比如被诟病已久的微信内置浏览器就不支持协商缓存。那么就会走强缓存(客户端会直接使用本地资源,服务器也不会返回304状态码)。

相关阅读

1、浏览器在使用强缓存时,会根据服务端返回的响应头中的 max-age 值和本地缓存的资源生成时间来判断资源是否过期。本地缓存的资源生成时间可以从响应头的 Date 字段获取,该字段表示服务端响应请求的时间。如果 max-age 时间未过期,浏览器会直接使用本地缓存的资源,否则会重新向服务端请求资源,并更新本地缓存。
2、浏览器在使用协商缓存时,会向服务端发送一份带有 Etag 或者 Last-Modified 标识的请求,这些标识是上一次请求时服务端返回的。服务端会根据请求头中的 Etag 或者 Last-Modified 和资源最后修改时间来判断资源是否变化。如果资源没有变化,服务端会返回 304 Not Modified 状态码,浏览器会直接使用本地缓存的资源,如果资源有变化,服务端会返回新的资源和新的标识。
3、本地缓存是由浏览器负责维护的。当浏览器发起一个请求时,会先在本地缓存中查找是否有对应的资源,如果有,就直接返回,如果没有,就向服务端发送请求。同时,当强缓存失效或者协商缓存未命中时,浏览器会从服务端获取新的资源和标识,并将它们保存到本地缓存中,以便下次请求时直接使用。在这个过程中,HTTP 协议只是规定了浏览器和服务端之间的通信规范,并没有直接参与缓存的实现。

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