为什么设置了Cache-Control还是频繁发起请求?
大家好,我在优化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需要配合其他头部字段?或者浏览器缓存和内存缓存有冲突?求大神指点具体排查方向…
其次,你提到浏览器和内存缓存可能冲突,确实是个点。你在代码里用了内存缓存,但浏览器有自己的缓存机制,这两个不一定是同步的。你可以先去掉内存缓存这部分,看看浏览器自带的缓存能不能正常工作。
关于axios的配置,你这看起来没问题,但可以检查一下是否在响应拦截器里对响应做了什么操作,可能会不小心清除了缓存头。
最后,别忘了检查一下请求的method是不是GET或HEAD,因为这些方法才支持缓存,POST啥的可不会缓存。
如果还搞不定,可以在请求头上加一个Cache-Control: no-cache, no-store, must-revalidate,然后一点点排查哪个配置影响了缓存行为。希望这些建议能帮到你,有时候开发真是又爱又恨啊。
immutable参数,改成这样:Cache-Control:max-age=300,immutable。浏览器有时候就是喜欢自作聪明重新验证缓存,加了 immutable 就能省掉这些麻烦。还有你那个 axios 拦截器其实跟浏览器缓存没啥关系,那是内存级别的缓存,建议直接把这块逻辑干掉,用不着这么折腾。如果还是有问题,检查下是不是有 Vary 头部字段配置太宽泛了,比如 Vary: * 这种写法会让缓存失效。
最后记得确认下 HTML 页面本身有没有加 no-cache 或者 no-store,这也会导致接口被穿透请求。