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

UP主~新杰 阅读 20

大家好,我在优化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需要配合其他头部字段?或者浏览器缓存和内存缓存有冲突?求大神指点具体排查方向…

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
♫伊糖
♫伊糖 Lv1
你这个情况啊,最简单的办法就是加上 immutable 参数,改成这样:Cache-Control:max-age=300,immutable。浏览器有时候就是喜欢自作聪明重新验证缓存,加了 immutable 就能省掉这些麻烦。

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

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