2011-08-15 78 views
45

我正在使用Amazon S3爲我的網站提供靜態資產。我希望瀏覽器儘可能長時間緩存這些資產。我應該包括我的資產HTTP中緩存控制標頭的最大值

Cache-Control: max-age=??? 
+0

可能max-age的值是依賴於瀏覽器/版本,並在任何方式代理... AFAIK沒有真正的標準/規範,這樣任何值將是一個猜測... – Yahia

回答

63

通常建議一年爲標準最大值。見RFC 2616

爲了紀念一個響應爲「永不過期」,源服務器發送一個 到期日期的大約一年,從迴應是 發送的時間。 HTTP/1.1服務器不應該在將來發送超過一個 年的過期日期。

雖然適用於舊expires標準,是有意義的申請cache-control太在沒有任何明確的標準指導。無論如何,只要您通常需要,隨意選擇任意長度的值可能會破壞某些用戶代理。所以:

Cache-Control: max-age=31536000 
16

哪些元數據報頭考慮的不是將其存儲爲「只要有可能,」而是沉澱,只要是合理的。例如,你不太可能需要將它緩存超過10年的時間......我是對的嗎?

的RFC這裏討論的max-age:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

埃裏克·勞倫斯說,之前IE9,IE瀏覽器會當作過時的任何資源具有的Cache-Control:max-age的值超過2147483648(2^31)秒,大約68年(http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx)。

其他用戶代理當然會有所不同,所以...嘗試選擇一個不太可能(而不是可能!)的數字來引起溢出。最大年齡大於31536000(一年)沒有意義,非正式地說這被認爲是合理的最大值。

+0

實際上,我在尋找特定的標題發送。我有內置到我的網站來更改文件的URL指向不同的文件名,如果我需要做出改變,並有遊客看到它的機制。我只需要發送特定頭文件的示例,讓瀏覽器無限期地緩存這些資源。 –

+9

緩存控制:最大年齡= 31536000將其緩存爲1年,這是最大推薦。 – EricLaw

+2

@Geoffrey:我覺得你無所適從凱西正在建設。他只是說當版本發生變化時他會更改他在標記中引用的URL。這是大多數頂級網站使用的最佳做法。 – EricLaw

1

誰創造最大1年緩存的建議,沒想到它通過適當的人。

首先,如果訪問者正在服務過期的緩存文件,那麼爲什麼它會提供任何好處讓它在1年後突然加載新版本?如果一個文件有1年的TTL,從功能的角度來看,這顯然意味着文件根本不打算被改變。

那麼爲什麼會需要超過1年?

1)爲什麼不呢?它沒有任何目的告訴訪問者瀏覽器「嘿,這個文件是1歲,這可能是一個想法,檢查它是否已被更新」。

2)CDN服務。大多數內容交付網絡使用緩存頭來決定從邊緣服務器有效提供文件的時間。如果您對這些文件擁有1年的緩存控制權,它將在某個時刻開始重新向源服務器請求未更改的文件,並且邊緣緩存需要完全重新填充,導致客戶端的負載更慢,並且不必要呼叫原點。

最長1年的要點是什麼?哪些瀏覽器在設置的金額高於31536000時會窒息?

+3

1年是互聯網時代的永恆。另外,如果你需要緩存認真你會處理(除高速緩存控制)的最後一次修改和/或ETAG機制。因此即使是一年後的重新請求也不會損害帶寬(304未修改) – redben

+0

1年不是永恆的,當你的圖像永遠不會改變(像互聯網上的大多數圖像),並且當你不想要一個CDN從原點刷新文件(這是毫無意義的)。至於最後修改的/ etag,當然這會啓動客戶端和服務器之間的請求和對話,只是爲了找出我們已經知道的「yup,它仍然可以提供緩存的文件」。你的論點基本上是「1年是互聯網上的永恆」,它不會提供任何有用的東西。我已經在圖像上設置了10年到期,這只是一個更好的最終結果。 – suncat100

+3

哦,還有默認的瀏覽器緩存大小。任何緩存的資產是否會在瀏覽器緩存中存活一年?我不知道。 – redben