Http Cache-Control,http头部已经设置了

http response

图片描述

chrome中的通信情况

图片描述

------20:01更新-------

又在response的header里面设置了etag和last-modified,但缓存还是没有用。

我是在chrome地址栏点网址回车,来重新发送请求的;此外我也试了chrome上的刷新按钮,也是一样,request header中都自带了max-age=0

更新后的http request
图片描述

更新后的http response
图片描述

更新后的chrome通信情况
图片描述

阅读 16k
4 个回答

request中带有Cache-Control:max-age=0,代表强制要求服务器返回最新的文件内容,关于max-age=0在request和response中的不同意义,可以参见这个stackoverflow上的问答What's the difference between Cache-Control: max-age=0 and no-cache?中的介绍,其中要点就是:如果max-age=0出现在请求中,则代表浏览器要求服务器,此次请求必须重新返回最新文件(请求完成后,你会看到http状态码是200);如果max-age=0出现在响应中,则代表服务器要求浏览器你在使用本地缓存的时候,必须先和服务器进行一遍通信,将etag、 If-Not-Modified等字段传递给服务器以便验证当前浏览器端使用的文件是否是最新的(如果浏览器用的是最新的文件,http状态码返回304,服务器告诉浏览器使用本地缓存即可;否则返回200,浏览器得自己吧文件重新下载一遍)。

回到你刚才的问题,由于你的request中有max-age=0,所以强制服务器重新返回文件了,这种情况一定是你的disable cache功能打开了,即这个位置:图片描述
把这个位置的选项勾掉即可。
还有就是检查这个区域:dev_disable_cache.jpg
确保这个区域也没有勾上。
如果这两项都没有勾上,那就不知道是什么原因了,换一个浏览器试一下。

2017-3-2更新:突然想起来一个问题,你不能光看response头信息。虽然写着200 OK,但是你还要看一下Header中的Status Code字段,看看是不是 200 OK(from disk cache)或者200 OK(from memeory cache)之类的。

看下 request header里有没有这个

cache-control:no-cache

要么你是刷新访问的,要么你开启了Disable cache (while DevTools is open),后者可以在调试工具右上角齿轮里关掉。

整整一个早上都在研究一样的问题,我是用的nodejs+express+reactjs,明明设置了

res.header('Cache-Control', 'max-age=604800, must-revalidate')

就是不起效果,一直都是200,200的,气死我了

然后我就换火狐,结果就正常了,该304的就304,该缓存的绝对不会发出请求,然后我用另一台电脑上的chrome访问我的网页,也都是正常的,就我本机上的chrome不正常。

现在只能猜测chrome太过聪明了,他能知道你是在调试本机上的代码,应该是我webpack设置里的某些项目透露了这一点吧,所以他默认就不使用缓存了,查看request里面的cache-control会发现chrome才会有max-age=0这个属性,火狐没有,但是很显然只有本机的chrome会强制不使用缓存

宣传栏