2015-12-24 39 views
3

我一直在使用ETags很長一段時間,我對它們如何使用以及它們允許做什麼感到非常滿意。ETags:驗證和高速緩存max-age

但是,我有時會遇到ETag驗證請求。在我的服務器上,我可以看到我的瀏覽器訪問了資源URL,然後獲取「未更改」響應。但是,它仍然是一個要求。

如何才能聰明的網絡服務器(我編碼我的NodeJS)避免被驗證只要cache-control: max-age=N去?例如,我的max-age表示TTL爲30天。客戶在那個時候不應該驗證Etag。那可能嗎?

回答

1

不可能在服務器級強制這一點,因爲它是決定這一點的客戶端。

像ETags這樣的高速緩存控制標頭不是指令提示。瀏覽器可以自由地忽略這些提示(例如,當您刷新頁面時,您明確要求瀏覽器重新檢查資源)。一些瀏覽器也會定期重新檢查資源。

這樣說,如果您的緩存控制標頭設置正確,那麼這些請求應該不經常發生,並且標準應該是請求不發送。

+0

好的。看起來沒有什麼我可以做的,除了提供更多的提示 - appcache等。謝謝你的提高(: –

+0

)你還需要記住,瀏覽器緩存不是無限的,東西會被擠出去(儘管在那例如,你不應該得到一個304 - 沒有修改的響應,因爲瀏覽器不會有原始下載或Etag)事實上,瀏覽器緩存比你想象的要小得多,特別是在移動設備上:http:// www。 guypo.com/mobile-browser-cache-sizes-round-2/ –

1

我在我的結尾(Ubuntu下的FF45)間歇性地看到問題。有些文件會在每次重新加載時檢查,而大多數則不會。我不太確定什麼能告訴Firefox應該在每個負載上檢查這樣或那樣的文件。

根據jscher2000在a blog上發佈的帖子,Firefox首先檢查Last-Modified,如果過期,則發送請求;請求將在If-None-Match中包含服務器ETag的值,並且我還可以看到If-Modified-Since標頭。

一般來說,Firefox不會重新請求或重新驗證尚未過期的緩存文件。您可以通過在有關更改設置更改Firefox的客戶端上的行爲:配置(顯然你需要清空緩存並重新啓動Firefox,以使更改生效):

browser.cache.check_doc_frequency(默認爲到期後) browser.cache.check_doc_frequency not working? @ mozillaZine Forums(清除緩存/重啓)

它看起來像我的check_doc_frequency參數設置爲3,這意味着它應該檢查,只有當他們被認爲是過時的文件。

可能的值及其影響

0 - 檢查每一次會話頁面的新版本(會話啓動時第一個應用程序窗口會打開,當最後一個應用程序窗口關閉結束)。
1 - 每次加載頁面時檢查一個新版本。
2 - 永遠不要檢查新版本 - 總是從緩存中加載頁面。
3 - 頁面過期時檢查新版本。(默認)

一兩件事,我做的是,我用以下兩個頭:

Cache-Control: max-age=3600 
Expires: Sun, Mar 27 2016 21:13:50 

可能會有某種形式的混亂,如果只max-age定義,那麼你在運行一些奇怪的情況下,錯過了具體的情況。

以防萬一,還有就是我的完整標題:

Cache-Control: max-age=3600,public 
Connection: keep-alive, Keep-Alive 
Date: Mon, 28 Mar 2016 02:56:20 GMT 
Etag: 6b395ccb5b0a913f1828cce3e2756bdc 
Expires: Mon, 28 Mar 2016 03:56:19 GMT 
Keep-Alive: timeout=15, max=5 
Server: Apache 
Set-Cookie: ... 

重複的「保持活動」的連接來自Apache的。