Appearance

HTTP缓存

Pcjmy2022-05-16计算机网络HTTP

HTTP缓存

http缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。常见的http缓存只能缓存get请求响应的资源,对于其他类型的响应则无能为力。

根据是否需要重新向服务器发起请求来分类,可分为强缓存协商缓存

强缓存

强缓存是利用HTTP请求头中的ExpiresCache-Control两个字段来控制的,用来表示资源的缓存时间

  • Expires:是HTTP1.0的规范,它的值是一个绝对时间的GMT格式的时间字符串。
  • Cache-Control:是HTTP1.1中出现的,一般利用该字段的max-age来判断,这个值是一个相对时间。

Expires时间是服务端返回的,比对的却是客户端时间,服务端与客户端时间不一致时会出现问题。

Cache-Control与Expires可以在服务端配置同时启用,同时启用的时候Cache-Control优先级高。

协商缓存

协商缓存是由服务器确定缓存资源是否可用。主要涉及到两组header字段:

  • Etag和If-None-Match
  • Last-Modified和If-Modified-Since

Last-Modify/If-Modify-Since

浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间。

当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回Last-Modify。

Last-Modify是以秒级别记录的,如果资源在一秒内发生变化,Last-Modify是无感知的。

Etag/If-None-Match

Etag/If-None-Match 是"实体标签"(Entity Tag)的缩写,是资源的一个唯一标识,资源变化都会导致ETag变化。服务器根据浏览器上送的If-None-Match值来判断是否命中缓存。

Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

Last Updated 2023-02-09 10:55:01