浏览器会如何对待标记了Cache-Control和Max-Age的内容的

如题,如果我在服务器端为某个人内容设置了缓存,那么在缓存有效的这段时间内,浏览器到底有没有请求服务器呢?我看了下Chrome的Network监控,得到的是304 Not Modified。这个status是浏览器自己得出来的还是跟服务器确认后得出来的?如果完全走的是客户端缓存,那么我如果在服务器端强制更新缓存,浏览器是不是也无法更新?

请输入图片描述

阅读 7.7k
4 个回答

服务器端设置缓存过期时间后,客户端会据此设置缓存内容的生存时间。客户端在生存时间内访问缓存内容时会询问服务器此内容是否有变化,如无变化则服务器只返回响应头,用于更新过期时间。

对应强制缓存,就需要通过附加版本标识来改变缓存内容。如图中的 stub.en.js?v=bb8ad211daea 这样的版本参数。

如果服务器设置了Cache-Control或者Expires过期时间,那么浏览器在这个过期时间内会使用缓存,不会产生请求,当超过这个过期时间,浏览器就会向服务器发送请求。
而请求发送到服务器之后,服务器会根据请求头的If-Modified-Since内容来判断这个内容是否在对应时间点之后有更新,如果没有更新那么就返回304以及Last-Modified请求头部,浏览器收到这个头部会更新If-Modified-Since的值,下次发生请求的时候会带上这个新的值;如果发生了更新,那么就会返回200以及更新之后的资源。

终于有人关注这个问题了,其实经过我测试,你设置Cache-Control根本没用,chrome和firefox照样会去服务器请求一次!

max-age 如果是 0,和 no-cache 效果一样,浏览器可以缓存文件,但需要每次和服务器确认,浏览器会发送一个请求,携带在请求资源时服务器发送的用来判断内容是否发生变化的头信息(比如,如果服务器发送了 ETag 响应头,浏览器再次请求就会带上 If-None-Match 这个请求头,这两个头只是举例,要想知道更多细节,可以自己搜索),如果服务器根据对应的头信息判断后响应 304 状态,代表请求的资源内容没有发生变化,浏览器就会继续使用原来缓存的内容。

如果设置的 max-age 是一个正整数,在这个正整数代表的秒数这段时间内,浏览器会直接使用缓存的文件,不需要也不会发送请求去询问服务器缓存内容是否发生了变化需要重新下载。

但是,浏览器也不一定会完全遵守你设置的 max-age,如果浏览器认为你设置的 max-age 时间太长了,或者你在开发者工具里面禁用了缓存,它会重新发送请求到服务器,并且可能不携带任何用来识别内容是否发生变化的头信息。

综上所述,浏览器的行为不一定完全可控,另一方面,和服务器正确响应请求也有关系。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题