2013-02-21 33 views
2

我使用s3來託管靜態網站。這個網站被放置在s3桶中,並由cloudfront分發。這一切運作良好,但當我們需要更改特定文件時,我們正面臨問題。如果我們在s3桶中更改index.html文件,我們沒有從cloudfront獲取最新文件。 我應該在s3上設置這些靜態文件的到期時間,只有在過期時間後,cloudfront纔會查找新版本的文件並分發新文件?S3,雲端和有效日期

回答

1

CloudFront使用原始服務器發送的Cache-ControlExpires標題來決定是否要將資源存儲在緩存中,並將其視爲新鮮資源多長時間。如果您不通過響應頭來控制緩存,那麼CF將在從原始數據獲取24小時後將每個資源視爲過時。或者,您可以配置分發以忽略緩存控制標頭,併爲您指定的每個資源使用到期時間。

當您在原點更新文件時,CF將不會嘗試刷新其副本直到其到期。你可以按照不同的策略讓CF更新緩存副本。 1)效率最低,不推薦使用invalidation。您可以通過AWS控制檯或API執行此操作。

2)通過發送Expires標題告訴CF何時查找更新的內容。例如,如果您對將新內容/版本部署到您的網站有嚴格的政策,並且您知道說幾乎每個星期四都會部署一個部署,那麼您可以發送一個Expires標題,其中包含您的來源集中的每個資源到下一個計劃的部署日期。 (這可能不適用於S3原點。)

3)最有效和最推薦的方法是使用versioned URLs。一個好的做法是將資源的最後修改時間包含在其訪問URI中。有了EC2或其他起源能夠提供動態內容的服務,使用S3來源相當容易,如果可能的話,它並不是那麼簡單。

因此,我建議使已更新的資源無效。

+0

你好,我們可以設置緩存控制爲無緩存的HTML文件,並將雲端總是採取最新的HTML文件? – Yalamber 2013-02-21 13:20:30

+0

首先,我不確定如何控制由S3發送的響應中的標題。這並不意味着這是不可能的,我從來沒有用過S3。但更重要的是,如果你的S3 orgin總是發送一個'Cache-Control:no-cache'頭文件,它基本上告訴CF_not_來存儲給定的資源,因此每次從CF請求時,它都會將請求轉發到原始地址獲取它,所以你根本不會從中受益。 – marekful 2013-02-21 13:25:24

+0

我打算在s3和cf上託管一個博客網站,但是像主頁和某些類別頁面這樣的一些文件需要經常更新,其他頁面(例如博客單頁)不會經常更改,因此我可以將其設置爲緩存,但某些html像主頁和類別頁面的文件我不希望被緩存但每次都得到文件。 – Yalamber 2013-02-21 13:39:17

1

它看起來像你必須設置在S3側的元數據:

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

我發現這樣做是使用BucketExplorer走「批量操作」最好的辦法,「更新元數據」 ,「添加元數據」,然後添加「緩存控制:最大年齡= 604800,公共」1周緩存期。