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 解决了这个问题。
从本月初(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 解决了这个问题。