Cache-Control headers 在 Chromium 93 中不再正确解释

Cache-Control headers no longer interpreted properly in Chromium 93

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

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

我们设法找到了这个问题 - 事实上,不是 Chromium 的问题,而是我们自己的代码中的一个 years-old 问题,该问题已被忽视好久不见。

针对特定情况,我们在 HTTP 响应中添加缓存 header 如下:

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

对于这个特定的 header,这不符合 the specifications,它们是。

Caching directives have the following rules to be valid:

  • Case-insensitive, but lowercase is recommended.
  • Multiple directives are comma-separated.
  • Some directives have an optional argument, which can be either a token or a quoted-string. (See spec for definitions)

换句话说,它应该是一个 comma-separated 指令列表,即

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

这(正确地)由于 Chromium 按预期更新而中断。 This changeset 显示了一个更新,它使 Chromium 在解释 Cache-Control header 时更加严格,特别是对于我们的情况,可以从以下内容确定 (new!) 单元测试:

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

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

Cache-Control: max-age=0

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

确保 Cache-Control header 在我们的代码库中 comma-separated 解决了这个问题。