首页 > 解决方案 > Cache-Control 标头在 Chromium 93 中不再正确解释

问题描述

自本月初(2021 年 9 月)左右以来,我们正在构建的 Web 应用程序间歇性地开始显示错误页面。我们已将其追踪到与 HTTP 响应缓存相关的问题,但我们在该时间段内对代码所做的更改都没有包含与之相关的更改,因此我们怀疑它是由 Chromium 93 更新引起的。

Chromium 93 版是否存在任何已知问题?

标签: google-chromehttpmicrosoft-edgechromiumcache-control

解决方案


我们设法追查到了这一点——实际上这不是Chromium 的问题,而是我们自己的代码中存在多年的问题,长期以来一直被忽视。

对于特定情况,我们向 HTTP 响应添加缓存标头,如下所示:

Cache-Control: max-age=0 must-revalidate

这不遵循此特定标头的规范,它们是。

缓存指令具有以下有效规则:

  • 不区分大小写,但建议使用小写。
  • 多个指令以逗号分隔
  • 一些指令有一个可选参数,可以是标记或带引号的字符串。(定义见规范)

换句话说,它应该是一个逗号分隔的指令列表,即

Cache-Control: max-age=0, must-revalidate

正如预期的那样,由于对 Chromium 的更新,这(正确地)中断了。这个变更集显示了一个更新,使得 Chromium 在解释 Cache-Control 标头时更加严格,特别是对于我们的情况,可以从以下(新的!)单元测试中确定:

TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithInterimSpaceIsRejected) {
  InitializeHeadersWithCacheControl("max-age=1 2");
  EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
}

所以看起来代码最初被解释为

Cache-Control: max-age=0

但在最近的 Chrome 版本中,现在完全被忽略了

确保 Cache-Control 标头在我们的代码库中以逗号分隔解决了这个问题。


推荐阅读