为什么设置了Cache-Control还是频繁发起请求?

UP主~新杰 阅读 46

大家好,我在优化API请求时设置了Cache-Control:max-age=300,但发现页面刷新时还是频繁发起请求,控制台网络标签也没显示缓存命中的状态。比如获取用户信息的接口,明明30秒内重复访问,为什么没走缓存呢?

尝试过检查响应头确实有Cache-Control:max-age=300,也确认了Last-Modified和ETag都正常。但用Chrome开发者工具的网络标签模拟”不使用缓存”时,请求确实减少了,但正常浏览时还是会走服务器。是不是axios的配置哪里错了?

这是请求拦截的代码:

axios.interceptors.request.use(config => {
  const cachedResponse = memoryCache.get(config.url);
  if (cachedResponse && !isStale(cachedResponse)) {
    return Promise.resolve(cachedResponse);
  }
  return config;
});

难道max-age需要配合其他头部字段?或者浏览器缓存和内存缓存有冲突?求大神指点具体排查方向…

我来解答 赞 10 收藏
二维码
手机扫码查看
2 条解答
子晨的笔记
当时我也卡在这,差点怀疑自己是不是疯了。首先,确认一下你的Cache-Control设置是不是真的生效了,有时候响应头被中间件覆盖了,你得确保是在正确的环节设置了这个头。

其次,你提到浏览器和内存缓存可能冲突,确实是个点。你在代码里用了内存缓存,但浏览器有自己的缓存机制,这两个不一定是同步的。你可以先去掉内存缓存这部分,看看浏览器自带的缓存能不能正常工作。

关于axios的配置,你这看起来没问题,但可以检查一下是否在响应拦截器里对响应做了什么操作,可能会不小心清除了缓存头。

最后,别忘了检查一下请求的method是不是GET或HEAD,因为这些方法才支持缓存,POST啥的可不会缓存。

如果还搞不定,可以在请求头上加一个Cache-Control: no-cache, no-store, must-revalidate,然后一点点排查哪个配置影响了缓存行为。希望这些建议能帮到你,有时候开发真是又爱又恨啊。
点赞
2026-03-25 13:35
♫伊糖
♫伊糖 Lv1
你这个情况啊,最简单的办法就是加上 immutable 参数,改成这样:Cache-Control:max-age=300,immutable。浏览器有时候就是喜欢自作聪明重新验证缓存,加了 immutable 就能省掉这些麻烦。

还有你那个 axios 拦截器其实跟浏览器缓存没啥关系,那是内存级别的缓存,建议直接把这块逻辑干掉,用不着这么折腾。如果还是有问题,检查下是不是有 Vary 头部字段配置太宽泛了,比如 Vary: * 这种写法会让缓存失效。

最后记得确认下 HTML 页面本身有没有加 no-cache 或者 no-store,这也会导致接口被穿透请求。
点赞 3
2026-02-14 16:03