2015-06-03 38 views
1

我有存储在OpenStack Swift容器中的文件对象,我可以指定带有POST对象请求的Content-TypeContent-Disposition标头。OpenStack Swift:添加缓存控制和过期标头

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

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

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

回答

0

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

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

  • 斯威夫特正确设置EtagLast-Modified HTTP头,这样浏览器就不会再次请求文件,除非我们重新加载或强制重新加载页面。只要URL稳定,当然可以使用固定的tempurl过期日期或者在容器上设置的标头X-Container-Read
  • 当页面重新加载时,Swift还会处理Last-Modified-Since请求标头,并返回304 Not Modified响应,因此除非内容发生更改,否则不会再次下载内容。
+1

但iPhone需要过期和高速缓存控制标题为他们不要再次重新下载。无论如何要设置它? – kevin

+0

我真的找不到方法。也许在公共的Swift容器前运行像cloudfront或cloudflare这样的缓存CDN会有帮助吗? –

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 

具体根据HTTP/1.1定义Cache-Control

  • 设置max-age时无需指定'public'。但你也可以做'高速缓存控制:公共',或有点冗余'高速缓存控制:公共,最大年龄= 6064800'
  • 我还没有找到一种方法来指定'过期'头,但是这些是没有必要。根据定义,如果指定了Cache-Control max-age,那么在任何情况下都将覆盖Expires。
  • 这一切都适用于HTTP/1.1。如果使用使用HTTP/1.0的史前客户端,那么仍然有可能使用相同的API方法使用Pragma头文件。
相关问题