OpenStack Swift:添加Cache-Control和Expires标头

时间:2015-06-03 13:57:59

标签: http-headers openstack openstack-swift

我有文件对象存储在OpenStack Swift容器中,我可以使用POST对象请求指定Content-TypeContent-Disposition标头。

然而,我无法设置Cache-ControlExpires标头来控制,因此浏览器会将文件保留在缓存中 - 文件主要是缩略图,徽标和背景图像必须由最终浏览器缓存。

我注意到容器接受X-Container-Read以允许公共访问文件,但我发现在容器级别也没有任何与缓存控制相关的内容。

那么,是否可以在OpenStack Swift中的对象或容器级别设置Cache-ControlExpires标头(或任何自定义标头)?我的意思是,中间不需要CDN或代理服务器吗?

3 个答案:

答案 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定义:

  • 您不需要指定公众&#39;设置max-age时。但您也可以执行“缓存控制:公共”,或者有点多余的“缓存控制:public,max-age = 6064800&#39;
  • 我找不到指定&#39; Expires&#39;标题,但这些并不是必需的。根据定义,如果指定了Cache-Control max-age,则无论如何都会覆盖Expires。
  • 这一切都适用于HTTP / 1.1。如果使用使用HTTP / 1.0的史前客户端,则可能仍然可能使用相同的API方法使用Pragma头。

答案 1 :(得分:0)

回答我自己的问题:无法在OpenStack Swift对象上设置Cache-ControlExpires HTTP标头。

然而,并不意味着浏览器没有缓存文件:

  • Swift正确设置EtagLast-Modified HTTP标头,因此浏览器不会再次请求该文件,除非我们重新加载或强制重新加载页面。当然,只要URL稳定,可以使用固定的tempurl到期日期,也可以使用容器上设置的X-Container-Read标头。
  • 当重新加载页面时,Swift还会处理带有Last-Modified-Since响应的304 Not Modified请求标头,因此除非更改内容,否则不会再次下载内容。

答案 2 :(得分:0)

是的,可以。

通过将Cache-Control和Expires添加到object-server.conf中的allowed_headers列表中,可以在对对象的POST请求中设置这两个标头。

在OpenStack Swift Pike上进行了测试。