强缓存
如果服务端觉得浏览器请求的资源应该被缓存下来,比如图片,css不经常改的资源,就会在http响应里添加一个响应头Catche-Control:max-age=1200(s),会让浏览器自动下载缓存到本地。 下一次请求资源时,先看看有没有过期,没过期直接用该资源,不发送请求。且返回Status Code:200,但是会添加上from memory cache或者from disk memory,这个由浏览器自己来判断,一般大文件放硬盘,小文件放内存。 如果过期,就会进行服务请求,如果在服务中没有采取协商缓存,就会返回最新资源+200+Catche-Control。
注意
- 每次Catche-Control服务端自己决定加不加过期时间,加了就能强制缓存。Catch-Control:no-Store表示不加过期时间
- from memory cache:内存
- from disk cache:硬盘
协商缓存
当缓存过期(Catch-Control)的时候,会请求服务端,根据Etag(请求头If-None-Match)判断资源是否为最新。如果是最新,直接返回304,表示资源未被加载,如果不是最新,且没有Last-Modifined,就会返回200+最新资源+最新Etag字符串 如果有Last-Modified(请求头If-Modified-Since),服务端就会检查修改时间是否一致,如果一致,返回304,告诉浏览器资源未修改,否则返回200+最新资源+最新资源修改时间
Etag
资源对应的唯一标识,是这个服务端生成的一个hash值,返回给浏览器,浏览器请求的时候带上请求键名,If-None-Match,值为Etag字符串,当再次请求到服务的时候,服务端会对浏览器的Etag字符串和服务端端Etag字符串进行对比。
Last-Modified
最新资源修改时间,浏览器第一次访问服务端时,服务端会返回资源和修改时间标识Last-Modified,浏览器再次请求时,请求头带上If-Modified-Since,那么服务端就会查看着两者是否一致
注意
Etag和Last-Modified可以都有,也可以只有一个,如果两者都存在,建议先判断Etag。比如说修改了一个文件,改完又改回去,修改时间Last-Modifed变了,但文件没变化。那这个时候Etag是不变的,所以Etag会更准确。