【问题标题】:GCP cloud storage still caches public object after specifying cache-control header指定缓存控制标头后,GCP 云存储仍然缓存公共对象
【发布时间】:2023-02-06 04:40:40
【问题描述】:

我正在使用云存储 REST api 将图像上传到对所有用户公开的存储桶。当上传具有相同对象名称的不同图像时,它会在 GCP 上覆盖它,但公共链接仍显示旧对象。我尝试将请求的 Cache-Control 标头设置为“no-store”,但问题仍然存在。对象的元数据(在 GCP UI 上)显示 Cache-Control 中没有提供任何字段。我怎样才能强制它立即刷新文件?

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage


    【解决方案1】:

    根据这个 cache directives 的 no - store 不缓存带有 no-store 的响应。这可以用 FORCE_CACHE_ALL 缓存模式在每个后端基础上覆盖。

    默认情况下,当整个存储桶是公共的,或者单个对象是公共的并且单个对象没有指定 Cache-Control 元数据时,Cloud Storage 会为对象分配一个 Cache-Control: public, max-age=3600 标头。您可以使用Cache-Control metadata 设置不同的值。 通过减少最大年龄值,这可能有助于您解决问题。

    【讨论】:

    • 这是我尝试做的,我添加了 Cache-Control 标头并尝试了 no-store、no-cache 或较低的 max-age,但是对象元数据在 Cache-Control 字段中没有显示任何内容,并且它的行为仍然相同
    • 你能检查这个缓存控制方法吗doc 可能会提供一些解决这个问题的想法。
    • 我确实按照指示使用了有效的 Cache-Control no-cache 标头,公共 url 仍然返回旧的对象状态
    • 您可以尝试在访问对象时向 URL 添加唯一的查询参数。这将有效地为该对象创建一个新的 URL,并且浏览器将不再能够使用该对象的缓存版本。另一种方法是将 Cache-Control 标头设置为一个短值,例如“max-age=1”,这将强制浏览器在 1 秒后重新获取对象。还值得检查您的存储桶前面是否有任何 CDN 或反向代理。如果是这样,您可能还需要清除那里的缓存。
    【解决方案2】:

    Google 将 Bucket 暴露的后端缓存到各种缓存中。我可以在每个请求中看到 3-4 个版本的文件。我不知道如何重置此行为,如果未启用 CDN,以下内容似乎无效:

    gcloud compute backend-buckets update web-app 
      --default-ttl=0 --max-ttl=0 --client-ttl=0 --cache-mode=CACHE_ALL_STATIC
    

    以下其中一项至少有助于禁用客户端缓存(curl -v 在一些随机时间后开始显示 Cache-Control: max-age=0,比如 15 分钟,GCP 在跨基础设施传播数据时不一致):

    gcloud compute backend-buckets update web-app 
      --custom-response-header 'Cache-Control: no-cache, max-age=0'
    
    gsutil -h "Cache-Control: public,max-age=0" cp *.html gs://web-app/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 2015-03-28
      • 2011-01-13
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多