我在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年缓存。有什么方法可以删除缓存标题,以使浏览器不缓存它?
答案 0 :(得分:1)
如果在执行请求时放置正确的标头Content-Encoding:gzip,则Google Cloud CDN支持gzip,但是指定了在指定gzip编码时对象的权重应小于10MB。
关于缓存,在某些情况下,即使您指定无缓存,内容can be eligible for caching也是如此。例如,使用签名URL时,对象才有资格被缓存。
如果对象是publicly available,则对象也是可缓存的,这就是您的情况。也许您可以尝试将存储桶设置为公开可读,然后为每个对象指定Cache-control标头。 另外,您可以尝试将对象从公共更改为私有,因此它们不具备可缓存性,然后仅授予您希望的用户范围。