如何实现max-age=0级缓存校验:正常拉新/异常用缓存的兼容方案?
若要指示后续每次请求前需检查已保存缓存的有效性,可在服务器响应中搭配验证器(ETag或Date+Last-Modified)使用Cache-Control: no-cache。
有一种兼容性更强的缓存重新验证方式,是用max-age=0, must-revalidate替代no-cache,相关技术讨论中提及过采用该方案的诸多历史原因。根据Webtechsurvey的使用统计数据,max-age=0, must-revalidate(搭配private或public)是no-cache替代方案里最受欢迎的选项。
还有一种相对小众的选项no-cache, must-revalidate, max-age=0,推测它可能旨在支持不识别no-cache的HTTP/1.0及其他场景,但相关讨论指出这会导致部分旧浏览器出现问题——这些浏览器修改了no-cache的行为。
这里存在一个矛盾点:与no-cache不同,使用must-revalidate时,若服务器无响应,则不允许使用缓存,应返回504错误;但如果不使用must-revalidate,又可能出现哈希误判的问题。
技术问询
如何实现具备max-age=0兼容性的强制缓存校验:在服务器正常响应时强制拉取新版本(无启发式风险),服务器无响应时则返回缓存内容?是否存在理想方案,还是必须做出妥协?
附言:当然,这种方案会导致在要求缓存完全最新的场景下,缓存可能出现过期情况,且需要付出额外HTTP请求的代价。但从有意识的风险策略来看,展示缓存内容可能比显示错误更利于SEO。
内容的提问来源于stack exchange,提问作者Svyatoslav Alekseev

