我一直在使用ETags很長一段時間,我對它們如何使用以及它們允許做什麼感到非常滿意。ETags:驗證和高速緩存max-age
但是,我有時會遇到ETag驗證請求。在我的服務器上,我可以看到我的瀏覽器訪問了資源URL,然後獲取「未更改」響應。但是,它仍然是一個要求。
如何才能聰明的網絡服務器(我編碼我的NodeJS)避免被驗證只要cache-control: max-age=N
去?例如,我的max-age
表示TTL爲30天。客戶在那個時候不應該驗證Etag。那可能嗎?
我一直在使用ETags很長一段時間,我對它們如何使用以及它們允許做什麼感到非常滿意。ETags:驗證和高速緩存max-age
但是,我有時會遇到ETag驗證請求。在我的服務器上,我可以看到我的瀏覽器訪問了資源URL,然後獲取「未更改」響應。但是,它仍然是一個要求。
如何才能聰明的網絡服務器(我編碼我的NodeJS)避免被驗證只要cache-control: max-age=N
去?例如,我的max-age
表示TTL爲30天。客戶在那個時候不應該驗證Etag。那可能嗎?
不可能在服務器級強制這一點,因爲它是決定這一點的客戶端。
像ETags這樣的高速緩存控制標頭不是指令提示。瀏覽器可以自由地忽略這些提示(例如,當您刷新頁面時,您明確要求瀏覽器重新檢查資源)。一些瀏覽器也會定期重新檢查資源。
這樣說,如果您的緩存控制標頭設置正確,那麼這些請求應該不經常發生,並且標準應該是請求不發送。
我在我的結尾(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的。
好的。看起來沒有什麼我可以做的,除了提供更多的提示 - appcache等。謝謝你的提高(: –
)你還需要記住,瀏覽器緩存不是無限的,東西會被擠出去(儘管在那例如,你不應該得到一個304 - 沒有修改的響應,因爲瀏覽器不會有原始下載或Etag)事實上,瀏覽器緩存比你想象的要小得多,特別是在移動設備上:http:// www。 guypo.com/mobile-browser-cache-sizes-round-2/ –