我想弄清楚最好的HTTP標頭髮送四個用例。我希望拿出不依賴於用戶代理/協議版本嗅探的頭文件,但我會接受,如果沒有其他適合。所有URL都通過完全自定義處理程序獲取,因此我可以根據需要選擇所有標題,這全部是關於中間代理和用戶代理。如果可能的話,這應該與HTTP/1.0和HTTP/1.1客戶端兼容。如果存在多種解決方案,通過電線發送時最好的解決方案將是最短的解決方案。HTTP頭:控制緩存和歷史機制
靜態公共內容
所有「靜態公共含量」的東西,HTTP的真正意義:如果URL是一樣的,內容是一樣的。我可以輕鬆地做到這一點:例如,我將用戶配置文件圖標放入http://domain.com/profiles/xyz/icon/1234abcd,其中「1234abcd」是圖標文件內容的SHA-1。如果我將來更改爲圖標,我將創建一個新的URL並修改所有應該使用新圖標的現有推薦人。什麼是最好的頭文件來聲明這可能會永久緩存並可能被共享?我目前正在思考一些問題:
Date: <current time>
Expires: <current time + one year>
這是否足以允許用戶代理和代理進行緩存?我需要Last-Modified
還是Pragma
?
靜態非公開內容
所有「靜態非公開內容」的東西,是靜態的,但可能無法提供給大家。實際上,這些內容僅對選定的登錄用戶可用(會話保持會話cookie保持會話UUID)。如果URL相同,則內容相同。但是,迴應並不公開。用例可以是社交網絡服務中選定好友共享的圖片。我目前在思考:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=<huge number>, s-maxage=0
這足以讓用戶代理緩存和禁用代理嗎?我需要Pragma
嗎?
揮發公開內容
所有「揮發性公開內容」的東西,易揮發,提供給大家。類似於http://slashdot.org/的首頁,當未登錄時。意圖是允許快速更新不變URL中的內容。 請注意,我不想破壞用戶代理歷史機制(即,從易失性頁面中單擊某些內容,然後點擊後退按鈕不應導致從服務器獲取易失性頁面 - 但是,請單擊一個鏈接去首頁應該從服務器獲取資源)。我目前正在思考:
Date: <current time>
Expires: <current time>
Cache-Control: public, max-age=0, s-maxage=0
這足以防止緩存但允許歷史機制(後退按鈕)?我知道,如果我發送Cache-Control: no-store, must-revalidate
我可以強制重新加載,但這不是我想要的,因爲這也會打破後退按鈕。我需要Last-Modified
還是Pragma
?
儘管這是公開的,但允許中間代理緩存此內容可能沒有意義,因爲它是不穩定的。
揮發性非公開內容
所有「揮發性非公開內容」的東西,易揮發,不提供給大家(私人)。類似於登錄時的http://slashdot.org/的頭版。意圖是允許快速更新不變URL中的內容。 請注意,我不想破壞用戶代理歷史機制(即,從易失性頁面中單擊某些內容,然後點擊後退按鈕不應導致從服務器獲取易失性頁面 - 但是,請單擊一個鏈接去首頁應該從服務器獲取資源)。我目前在思考:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=0, s-maxage=0
這足以防止緩存但允許歷史機制(後退按鈕)?我需要Pragma
嗎?
的事情,還需要我的建議的首部測試:
- 驗證私人內容將無法通過HTTP/1.0代理被泄露。
- 驗證緩存在代理中是否正常工作。
- 確認緩存在用戶代理中正常工作。
- 驗證用戶代理歷史記錄機制在用戶代理(所有情況下)中工作。
- 驗證在鏈接到易失性頁面後,從服務器獲取新鮮內容。
- 使用HTTPS而非HTTP驗證所有結果。
我知道以前的類似問題在http://stackoverflow.com/questions/2970938/ideal-http-cache-control-headers-for-different-types-of-resources - 但是,這是缺少三個重要的難題:後退按鈕行爲,用戶代理兼容性和HTTP/1.0代理支持。 –
另一個經常引用的來源http://www.mnot.net/cache_docs/也受到不處理現實世界的用戶代理行爲與後退按鈕和HTTP/1.0代理支持。 –
這裏有一篇關於緩存控制的文章:http://palisade.plynt.com/issues/2008Jul/cache-control-attributes/ - 也缺少真實世界的後退按鈕行爲,用戶代理兼容性和HTTP/1.0代理支持。 –