设置cache-control=no-cache的页面刷新后变为max-age=0且返回200
问题根因分析
- 缓存指令配置方式错误
<meta http-equiv="cache-control">属于已经被淘汰的缓存配置方式,浏览器、代理服务器、Web服务器(包括你用的IIS)都会优先读取实际的HTTP响应头,忽略HTML内部meta标签设置的缓存规则。你强制刷新时看到响应头带no-cache只是临时场景下的透传效果,并不是稳定生效的配置,绝大多数场景下这个meta配置不会生效。 - 普通刷新的
max-age=0是浏览器默认行为
所有主流浏览器执行普通刷新操作时,都会主动在请求头附加Cache-Control: max-age=0,要求服务端对资源做新鲜度校验,这个行为和你页面本身的缓存配置无关,属于浏览器用户主动触发的校验逻辑。 - 返回200而非304的原因
304协商缓存生效的前提是服务端返回了校验标识:ETag或者Last-Modified响应头,且浏览器后续请求时携带对应的If-None-Match/If-Modified-Since请求头,服务端对比后确认资源未修改才会返回304。你当前的IIS环境没有配置对HTML资源输出这两个校验头,自然无法触发304响应,直接返回了完整的200响应。
解决方案
- 移除页面中
<meta http-equiv="cache-control" content="no-cache">这行配置,所有缓存规则在服务端配置:
你可以在项目根目录的web.config中添加如下配置,给HTML资源设置正确的缓存响应头并开启ETag校验:<system.webServer> <staticContent> <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="0.00:00:00" cacheControlCustom="no-cache" /> </staticContent> <httpProtocol> <customHeaders> <add name="Cache-Control" value="no-cache" /> </customHeaders> </httpProtocol> </system.webServer> - 配置完成后重启IIS Express,验证响应头中是否包含
Cache-Control: no-cache以及ETag字段,后续普通刷新就会正常返回304响应。
内容的提问来源于stack exchange,提问作者NunoRibeiro
相关产品推荐
相关产品推荐

