• 当浏览器第一次加载资源的时候,返回一般为200,意思是成功获取资源,并会在浏览器的缓存中记录下max-age;
  • 当第二次访问的时候:如果只是用浏览器打开,那么浏览器会去判断这个资源在缓存里有没有,如果有的话,会去判断max-age,看看过期没有,如果没有过期,则直接读缓存,根本不会和服务器进行交互,换句话说,断网都能打开,就和本地跑一样。如果已经过期了,那就去服务器请求,等待服务器响应,这是很费时间的,服务器如果发现资源没有改变过,那么就会返回304,告诉浏览器,我没变过,你去读缓存吧,于是浏览器也不用从服务器拉数据了,然而,等待服务器响应也是一个很要命的问题,在网速发达的今天,等一个响应,有时比下载还慢。如果是用浏览器刷新的,那么浏览器不会去判断max-age了,直接去服务器拿,如果服务器判断资源没变过,则还是会返回304,和上面是一样的,所以刷新一下,其实很可怕,等于把所有的资源都要去服务器请求一边,问问服务器过期了没有。

也就是说:在一般情况下,浏览器在发请求前,感觉自己可能缓存了某个文件,就先把自己缓存的文件信息放在请求头里。
服务器在发送响应前,对比一下这个文件信息,发现浏览器缓存的文件就是它,于是决定不发送整个文件内容,直接告诉浏览器 304 。
浏览器接收到 304 时,就知道原来我缓存的就是跟服务器端一样的文件,于是就直接拿本地缓存来用了。
如果服务器发现浏览器的缓存文件信息已经是旧的了,服务器就直接正常的发送文件内容,浏览器正常的接收文件内容了。

12-11 20:01