我有文件对象存储在OpenStack Swift容器中,我可以使用POST对象请求指定Content-Type
和Content-Disposition
标头。
然而,我无法设置Cache-Control
和Expires
标头来控制,因此浏览器会将文件保留在缓存中 - 文件主要是缩略图,徽标和背景图像必须由最终浏览器缓存。
我注意到容器接受X-Container-Read
以允许公共访问文件,但我发现在容器级别也没有任何与缓存控制相关的内容。
那么,是否可以在OpenStack Swift中的对象或容器级别设置Cache-Control
和Expires
标头(或任何自定义标头)?我的意思是,中间不需要CDN或代理服务器吗?
答案 0 :(得分:3)
Openstack swift可以毫无问题地处理缓存过期。唯一需要的是正确使用HTTP标头。
例如,要将缓存有效期限制为一周最大值,您只需为“缓存控制”设置标题即可。像这样:
curl -X POST -H 'X-Auth-Token: YOURTOKEN' -H 'Cache-Control: max-age=604800' https://openstack/container/object
或者如果您使用swift客户端,请执行以下操作:
swift post --header 'Cache-Control: max-age=604800' <container> <object>
测试它是否有效:
curl -I https://openstack/container/object
根据Cache-Control的HTTP / 1.1定义:
答案 1 :(得分:0)
回答我自己的问题:无法在OpenStack Swift对象上设置Cache-Control
和Expires
HTTP标头。
然而,并不意味着浏览器没有缓存文件:
Etag
和Last-Modified
HTTP标头,因此浏览器不会再次请求该文件,除非我们重新加载或强制重新加载页面。当然,只要URL稳定,可以使用固定的tempurl到期日期,也可以使用容器上设置的X-Container-Read
标头。Last-Modified-Since
响应的304 Not Modified
请求标头,因此除非更改内容,否则不会再次下载内容。答案 2 :(得分:0)
是的,可以。
通过将Cache-Control和Expires添加到object-server.conf中的allowed_headers列表中,可以在对对象的POST请求中设置这两个标头。
在OpenStack Swift Pike上进行了测试。