Web开发同学(前端工程师和后端工程师)经常会遇到304的响应,304的意思是浏览器已经缓存了,浏览器直接响应,不用去服务器。解决浏览器缓存问题最常见的方法是在静态文件后面加一个版本号,这样浏览器就不会响应缓存了。那么网页浏览器如何缓存数据:Expires早期的网页使用这个字段来告诉浏览器缓存多长时间。这个缓存的原理是根据当前服务器时间加上缓存的有效时间,最终在未来产生一定的失效。时间值返回给浏览器。比如过期时间是2020年,当用户刷新页面时,会先判断当前时间是否是2020年,如果不是,浏览器直接将缓存的数据返回给用户。这种缓存的缺点之一是如果用户修改了他的本地时间,缓存可能会失效。由于Expires的不足,后来改进了cache-control。Cache-control不再保存绝对时间,而是保存相对时间。例如,缓存为60秒。需要注意的是,如果你设置了max-age=60,那么在这60秒内,即使服务器被修改,你也不会得到新的数据,所以慎用这个,对应的叫no-cache,no-cahe不是没有缓存,而是每次都和服务器比较,如果服务器没有更新,则读取缓存,否则读取新的,对应no-cache就是no-store。no-store实际上是在告诉浏览器不要读取缓存。Last-Modified和If-Modified-SinceLast-Modified是服务器返回给浏览器的内容。If-Modified-Since是浏览器告诉服务器的。Modified,即这个资源最近被修改的时间A,响应http状态码为200,浏览器保存这个时间A,浏览器下次请求时会把这个If-Modified-Since带到服务器作为对比,如果两次时间相同,则不更新资源,浏览器直接返回自己缓存的资源,响应的HTTP状态码为304,如果两次时间为不同,则服务器再次返回Last-Modified时间和200的http状态码。但是这种策略也有缺点,就是最小的时间单位是1s。如果在1秒内发送了多个更新,浏览器将不会知道。Etag和If-no-match因为Last-Modified不支持二级变化,后来Etag出现了。Etag是文件修改时间等hash的结果,不存储具体的时间值。这样每次请求时,浏览器都会将If-no-match与服务器的Etag进行比较。如果它们相同,则转到缓存。如果不一样就到服务器去缓存,可以精确到秒级
