当前位置: 首页 > 知识库问答 >
问题:

Chromium 93中不再正确解释缓存控制标头

鱼安然
2023-03-14

从本月初(2021年9月)开始,我们正在构建的网络应用程序断断续续地开始显示错误页面。我们已经追踪到与HTTP响应缓存相关的问题,但是我们在那段时间内对代码所做的更改都没有包含与之相关的更改,所以我们怀疑这是由Chromium93更新引起的。

93版Chromium有任何已知问题吗?

共有1个答案

陆甫
2023-03-14

我们设法找到了这个问题——事实上,这不是Chromium的问题,而是我们自己的代码中一个多年的问题,很久以来都没有被注意到。

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

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

这不遵循此特定标头的规范。

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

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

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

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

由于按预期更新Chromium,这(正确地)中断了。此更改集显示了一个更新,在解释Cache-Control标头时使Chromium更加严格,对于我们的情况,尤其可以从以下内容中确定(new!)单元测试:

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

因此,代码最初被解释为

Cache-Control: max-age=0

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

确保缓存控制头在整个代码库中以逗号分隔,解决了此问题。

 类似资料:
  • 我们已经配置nginx服务器添加缓存控制头到公共和到期时间到1个月。但是当我们从浏览器发出请求时,客户端正在添加缓存控制:无缓存头。正因为如此,它每次都是新鲜下载内容,而不是提供缓存版本。 我怎样才能缓存静态文件? 如果我从终端触发请求,服务器添加的缓存控制标头在响应标头中可见。

  • 我想在缓存控制头中设置max age以响应。我已经写了如下,但仍然有max-age 0。我想只为一种方法设置max age,所以我不想禁用默认值。我认为应该是ovveride。 有人知道我做错了什么吗?

  • 使用 rax-plugin-pwa 插件,可以方便快捷的使用 Service Worker 控制缓存,以获得更快的加载速度。 首先,安装 build-plugin-rax-pwa 插件依赖: $ npm install build-plugin-rax-pwa --save 在工程配置 build.json 中添加 pwa 插件并配置缓存目标: { "plugins": [ [

  • ETag标题的定义(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag): ETag HTTP响应头是资源的特定版本的标识符。它使缓存更有效,并节省带宽,因为如果内容没有改变,web服务器不需要发送完整的响应。另一方面,如果内容已经改变,etags有助于防止资源的同时更新互相覆盖(“空中冲突”)。 缓存控制头的定义(http

  • 我有一个问题与超文本传输协议头-缓存控制:max-age=1234我的源有那个头,但任何方式发送请求和接收304.我需要可能我错过了什么?还有一个,源除了缓存控制: max-age=1234在"响应头"有缓存控制: max-age=0在"请求头",可能是它的影响。 我的一个资源响应标题,示例: > 远程地址:10.6.237.13:443请求请求方式:GET状态码:304未修改

  • 在nginx中使用add_header指令时,会将该头添加到来自源服务器的响应中。 假设源服务器返回缓存控制公共,最大年龄=60。但在nginx反向代理位置中,您可以设置如下内容: 添加\u头缓存控制公用,最大年龄=10 这到底是做什么的?我可以想到两种不同的情况: 1)Nginx尊重来自源服务器的缓存控制报头,并将内容存储在其缓存中,过期时间为60秒。然后传递带有覆盖标头的响应,导致客户端将资源