2015-06-03 36 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頭文件。
相關問題