几个月前,为存储桶激活了Cloud CDN。我们的存储数据会定期通过后端更改。因此,为了使缓存版本无效,我们在提供给客户端的url上添加了一个changedDate
的查询参数。
那时效果很好。
过去几个月(可能数周)中的某个时候,Google似乎已对此进行了更改,现在它忽略了从存储桶中进行缓存的查询字符串。
我不喜欢每次上传文件时删除旧文件并上传文件名已更改的新文件的想法...
编辑: 为了澄清:官方文档(cloud.google.com/cdn/docs/caching)已经声明他们现在忽略存储桶的查询字符串:
对于后端存储桶,缓存键由不包含查询>字符串的URI组成。因此https://example.com/images/cat.jpg,https://example.com/images/cat.jpg?user=user1和https://example.com/images/cat.jpg?user=user2是等效的。
答案 0 :(得分:1)
我们也受此影响。与Google支持人员联系后,他们确认这是永久更改。推荐的解决方法是在对象名称中使用版本控制,或使用缓存无效化。后者听起来有些奇怪,因为缓存失效documentation指出:
无效是在特殊情况下使用的,而不是正常工作流程的一部分。
答案 1 :(得分:0)
对于后端存储桶,如官方文档所述,缓存键由不包含查询字符串的URI组成。1存储桶未评估查询字符串,但CDN仍应这样做。我可以重现这种情况,但目前仍然可以将查询字符串用作缓存无效化器。
似乎发生这种变化的原因是,旧的行为导致丢失了缓存机会,更高的成本和更高的延迟。目前唯一推荐的解决方法是通过将版本合并到对象名称(对于您的情况而言这似乎不是有效的选项)或使用缓存无效来创建新对象。
使特定对象的缓存无效将需要使用特定查询。也许允许将此类对象缓存一定时间的Cache-Control标头可能是您的解决方法。 Cloud CDN缓存的过期时间由“缓存控件:s-maxage”,“缓存控件:max-age”和/或Expires标头2定义。
答案 2 :(得分:0)
根据doc,当使用后端存储桶作为Cloud CDN的来源时,请求URL中的查询字符串不包括在缓存键中:
对于backend buckets,缓存键由URI组成,而没有协议,主机或查询字符串。
也许不是使用GCP提倡的best practices来查询字符串来标识缓存内容的不同版本。但是对于某些遗留问题,必须如此。
因此,一种解决方法是使后端存储桶成为static website(此处不要启用CDN),然后使用custom origins(由Internet network endpoint groups后端服务支持的Cloud CDN)指向该静态网站。
对于后端服务,查询字符串是缓存键的一部分。
对于backend services,Cloud CDN默认使用完整的请求URI作为缓存键
就是这样。是的,这很乏味,但是有效!