google-chrome - Cache-Control 标头在 Chromium 93 中不再正确解释
问题描述
自本月初(2021 年 9 月)左右以来,我们正在构建的 Web 应用程序间歇性地开始显示错误页面。我们已将其追踪到与 HTTP 响应缓存相关的问题,但我们在该时间段内对代码所做的更改都没有包含与之相关的更改,因此我们怀疑它是由 Chromium 93 更新引起的。
Chromium 93 版是否存在任何已知问题?
解决方案
我们设法追查到了这一点——实际上这不是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 标头在我们的代码库中以逗号分隔解决了这个问题。
推荐阅读
- javascript - 数组对象 .map 和 forEach
- python - model.fit() 不接受 tf.data.Dataset 的输入形状
- firebase - Firebase 托管静态网站无法正常工作
- java - Jsoup 移除父元素
- r - R Shiny:用画笔链接多个图
- swift - 如何在没有注册 Swift iPhone 应用程序的情况下保护数据
- r - 将 R Shiny 应用程序部署到 shinyapps.io 的问题
- python - virtualenv 选择 python 版本给出权限被拒绝错误
- python - ImportError:没有名为 tinyec.registry 的模块
- css - Angular 组件样式预算