禁用Cloud CDN对象的浏览器缓存错误(通过Google Cloud Storage的存储桶)

时间:2019-07-13 11:14:14

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

我在Google Cloud Storage中有一个存储桶,并且通过上述存储桶作为后端通过Google Cloud Load Balancing提供其内容。存储桶中的所有对象都是公共的。 JS,CSS,HTML和图像存储在存储桶中。

由于Cloud CDN不支持gzip压缩(afaik),因此我已将gzip压缩文件上传到具有适当标头的存储桶中。(我所有的用户都使用支持gzip压缩的浏览器)

我想为几个js文件禁用缓存(特别是在用户浏览器中进行缓存,但在Google的lb中也没有缓存也可以)。为此,我将以下标头添加到存储桶中的对象

Content-Type    application/javascript;charset=UTF-8
Content-Encoding    gzip
Content-Language    en
Cache-Control   private, max-age=0, no-transform, no-cache, no-store, must-revalidate

即使此浏览器获取的公共缓存标头的有效期为1年,也是如此。我尝试通过curl发送相同的请求,结果如下。

curl -v --request GET \
  --url https://cdn.intelliticks.com/prod/common/client/inject.min.js \
  --header 'Accept: */*' \
  --header 'Cache-Control: no-cache' \
  --header 'Connection: keep-alive' \
  --header 'Host: cdn.intelliticks.com'

返回正确的缓存头。但在请求下方(带有默认由浏览器添加的accept-encoding标头)

curl -v --request GET \
  --url https://cdn.intelliticks.com/prod/common/client/inject.min.js \
  --header 'accept-encoding: gzip, deflate' \
  --header 'Accept: */*' \
  --header 'Cache-Control: no-cache' \
  --header 'Connection: keep-alive' \
  --header 'Host: cdn.intelliticks.com'

返回1年缓存。有什么方法可以删除缓存标题,以使浏览器不缓存它?

1 个答案:

答案 0 :(得分:1)

如果在执行请求时放置正确的标头Content-Encoding:gzip,则Google Cloud CDN支持gzip,但是指定了在指定gzip编码时对象的权重应小于10MB。

关于缓存,在某些情况下,即使您指定无缓存,内容can be eligible for caching也是如此。例如,使用签名URL时,对象才有资格被缓存。

如果对象是publicly available,则对象也是可缓存的,这就是您的情况。也许您可以尝试将存储桶设置为公开可读,然后为每个对象指定Cache-control标头。 另外,您可以尝试将对象从公共更改为私有,因此它们不具备可缓存性,然后仅授予您希望的用户范围。