浏览器在请求已经访问过的URL时,会判断是否使用缓存,判断是否是由缓存的主要依据是缓存是否在有效期内,如果在有效期内,则会直接使用缓存(如上图中的情况,注意status code
)这一部分主要通过response header中的两个字段来判断:
- Expires:
表示有效期,是一个GMT时间,以客户端为基准,与服务器时间可能存在一定时间差 - Cache-Control中的max-age值:
表示最大有效时间,单位是s,优先级比expires高,为了解决expires时间差的问题而出现的
当超过缓存期时,浏览器不会直接请求资源,而是判断缓存是否有更新,能否继续使用,判断方法有两种:
- Last-Modified和 if-Modified-Since:当浏览器第一次请求某个资源时,服务器的响应中有一个Last-Modified字段,表示最近一个修改缓存的时间,当缓存过期后,浏览器就会把这个时间放在请求的If-Modified-Since字段中并发送给服务器,由服务器来判断缓存是否有更新
- Etag和If-Node-Match:当浏览器第一次请求某个资源时,服务器的响应中有一个ETag字段,是用于表示文件的字符串,一旦文件更新,该字段就会发生变化;当缓存过期后,浏览器会把该字段的内容放在请求的If-None-Match字段中,并发送给服务器,由服务器来判断缓存是否有更新。
注意:Etag比Last-Modified的更高(因为Etag更加准确,而Last-Modified只能精确到秒)