You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:36:04