HTTP缓存的使用

当本地没有文件时,浏览器请求相应服务器获取到文件,并将文件存放到浏览器的缓存目录下,当第二次访问该文件时,浏览器会向服务端发起一个条件请求,询问当前缓存中的文件是否可用。这里的条件请求,指的就是GET请求的请求首部字段中带有“if-Modified-Since”字段。这个字段只在Get请求与HEAD请求中有效。

if-Modified-Since : GMT格式的时间字符串,服务端将该字段与文件最后修改时间的时间戳进行对比,若文件有更新,则返回最新的文件资源,浏览器放弃缓存资源并更新最新的文件;若文件没有更新,服务器端返回”304”状态码,表示浏览器端缓存文件可用。

缺点:

  • 由于是GMT格式的时间字符串,有可能在文件没有改动的情况下,时间戳有更新,造成缓存失效。
  • 只能精确到秒级别,对于一些更新频繁的文件资源,将无法生效。

于是HTTP1.1中引入ETag解决这个问题。

ETag: Entity Tag ,实体标签,类似于”指纹”,服务端在客户端请求资源时,返回对应的资源与ETag值(通常为资源的散列值),客户端在下次请求该资源时,会在请求中带上”ETag”与”If-None-Match”字段,服务端将该字段的值与现有文件的ETag值做对比,若有更新,则返回最新资源;若没有更新,则返回304状态码。

虽然问题解决了,但是在判断缓存是否可用时,客户端依然要发起一次请求询问服务端当前缓存是否可用,那么能不能在不发起请求的情况下进行判断呢?Expires字段由此而生。

Expires:GMT格式的时间字符串,,即在此之后,该请求失效。

缺点:由于是GMT格式时间字符串,有可能因为客户端与服务端采用了不同的时间而导致缓存无法生效。

这种情况下,Cache-Control字段在保持相同功能下,提供了更细密度的灵活控制。

使缓存失效

由于浏览器是按照URL进行缓存的,所以使缓存主动失效的方法是使用不同的URL请求,如不同的资源对应不同的版本号。

# 缓存

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×