为什么设置了Cache-Control还是频繁请求资源?
我在开发单页应用时给API接口设置了Cache-Control:max-age=30,但发现每次页面刷新都会重新请求JSON数据,明明应该缓存30秒才对。
代码是这样写的:
fetch('/api/data', {
headers: { 'Cache-Control': 'max-age=30' }
}).then(res => res.json())
.then(data => console.log('fetched:', data));
检查浏览器网络面板发现响应头确实有cache-control: max-age=30,但状态始终是200而不是304或从缓存加载。难道是因为用了fetch API特殊处理?或者需要额外设置其他HTTP头?
首先,
Cache-Control是服务器响应头里设置的,而不是在客户端请求头里设置的。你现在的代码是把Cache-Control写在了fetch的请求头里,这其实是无效的。浏览器不会根据请求头里的Cache-Control来决定是否使用缓存,而是根据响应头里的Cache-Control。正确的做法是,在服务器端返回的响应头里加上
Cache-Control: max-age=30。比如如果你用的是Node.js和Express,可以这样写:另外需要注意的是,如果服务器同时返回了
ETag或者Last-Modified,浏览器可能会优先尝试协商缓存,也就是发送条件请求(比如带If-None-Match或If-Modified-Since头)。这种情况下,状态码可能是304,但本质上还是走缓存的。还有一点要特别提醒:如果你的API接口涉及敏感数据,比如用户信息或者认证相关的内容,一定要小心缓存带来的安全问题。建议你在响应头里加上
Vary: Authorization或者Vary: Cookie,确保不同用户的请求不会因为缓存而被混淆。像这样:最后补充一句,调试缓存问题的时候,别忘了清除浏览器缓存或者用隐身模式测试,不然可能被之前的缓存行为干扰,导致你以为代码没生效。我自己就经常被这个坑到,真是又累又烦。
总结一下,把
Cache-Control放到服务器响应头里,注意安全相关的头设置,问题应该就能解决。