2013-01-24 66 views
28

我的問題是:有時瀏覽器過度緩存一些資源,即使我已經修改它們。但是在F5之後,一切都很好。什麼是緩存控制的默認值?

我整個下午都在研究這個案例。現在我完全明白了「Last-Modified」或「Cache-Control」的意思。我知道如何解決我的問題(只是.js?版本或明確的最大年齡= xxxx)。但問題仍然沒有解決:如何瀏覽器處理響應頭沒有「的Cache-Control」是這樣的:

Content-Length: 49675 
Content-Type: text/html 
Last-Modified: Thu, 27 Dec 2012 03:03:50 GMT 
Accept-Ranges: bytes 
Etag: "0af7fcbdee3cd1:972" 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Date: Thu, 24 Jan 2013 07:46:16 GMT 

他們顯然緩存它們

enter image description here時「在欄中輸入」

回答

7

默認緩存控制頭是:私人

緩存機制可能會將此頁面緩存在專用緩存中,並僅將其重新發送給單個客戶端。 這是默認值。大多數代理服務器不會使用此設置來緩存頁面。

請參閱http://msdn.microsoft.com/en-us/library/ms524721%28v=vs.90%29.aspx

+1

1)除以值爲何我看不到緩存控制:在響應頭中是私人的? 2)max-age =? – rhapsodyn

+5

這不回答這個問題。這回答了IIS 6中的默認設置。 – SilverlightFox

0

不具備高速緩存控制頭部的瀏覽器在每次加載一個新的(?)第一次請求的資源。點擊F5可以使該頁面中的任何緩存項無效(甚至邏輯刪除),通過充當沒有本地版本的方式強制完成重新加載 - 我不確定瀏覽器在再次請求它們之前是否從緩存中刪除這些資源。

有趣的是,在某些瀏覽器中有一些「附加」設置會導致一些優化,例如每頁加載只請求一次資源。如果您的圖像隨計數器等每個請求發生變化,即使多次使用該圖像,也只會看到該圖像的一個版本。

下一個是瀏覽器通過應用某種本地'優先'緩存來重用未明確設置爲nocache的圖像。如果每次需要將請求設置爲重新驗證並將過期設置爲-1或類似的內容時都想要請求。

因此,根據資源的具體情況,任何情況下都不會觸發某些默認設置,這些默認設置與閱讀規格時所期望的不同。

關於來源是否是本地,驅動器或真正的遠程互聯網服務器,可能還存在不同的行爲。說並非所有的瀏覽器都有不同的表現,而且我非常有限。

什麼是幫助檢出www.google.com並尋找他們的頁面請求的跟蹤像素(兩個1x1像素從metrics.gstats.com請求與子域上的隨機部分)。

如果您使用螢火蟲檢查標題,您會發現它們以任何可能的方式指定nocache指令。頭讀取這樣的:

Alternate-Protocol 443:quic 
Cache-Control no-cache, must-revalidate 
Content-Length 35 
Content-Type image/gif 
Date Mon, 25 Nov 2013 14:33:30 GMT 
Expires Fri, 01 Jan 1990 00:00:00 GMT 
Last-Modified Tue, 14 Aug 2012 10:47:46 GMT 
Pragma no-cache 
Server sffe 
X-Content-Type-Options nosniff 
X-Firefox-Spdy 3 
X-XSS-Protection 1; mode=block 

嘗試這是一個設置,並檢查是否能解決問題,瀏覽器沒有拿起你的改變資源。必須重新驗證指令將導致代理緩存每次請求資源並檢查304個未修改的答覆。

我目前遇到類似的情況。我有一個本地主機連接設置etag和所有發生的事情是緩存永遠不會問。我沒有設置緩存信息或類似的。單獨指定etag接口會導致FireFox不再請求資源。所以我遇到類似於你的問題的東西。

+0

no-cache已暗示它必須每次都重新驗證。因此,在這種情況下,只需要no-cache – Klimashkin

+0

就足夠了。關於「沒有緩存控制頭,瀏覽器在每次加載新頁面時都會請求資源」,但Google Chrome似乎並不適用。它似乎無限期地緩存這些項目。 (我不確定其他瀏覽器。) – Sam

+0

'打到F5,你無效(甚至邏輯刪除)該頁面內的任何緩存項目,迫使完全重新加載'這是不對的。這隻會導致瀏覽器檢查更新的資源,它不會使當前的緩存無效。但是,按下Ctrl + F5組合鍵時,某些瀏覽器可以執行此操作。 – SilverlightFox

13

RFC 7234細節應該是默認做什麼瀏覽器和代理:

雖然緩存是HTTP的一個完全可選的功能,它可以 假定重用緩存的響應是可取的,這樣的 重用是默認行爲,當沒有要求或本地 配置阻止它。因此,HTTP緩存要求爲 ,重點在於防止緩存存儲不可重用的響應或不恰當地重複使用存儲的響應,而不是要求緩存始終存儲和重用特定響應。

5

緩存通常在瀏覽器中默認啓用,因此cache-control可用於自定義此行爲或禁用它。

雖然緩存是HTTP的完全可選功能,但可以假定重用緩存的響應是可取的,並且當沒有要求或本地配置阻止時,這種重用是默認行爲。因此,HTTP緩存要求的重點在於防止緩存存儲不可重用的響應或不恰當地重複使用存儲的響應,而不是強制高速緩存始終存儲和重用特定響應。 [https://tools.ietf.org/html/rfc7234#section-2]

瀏覽器認爲一個緩存響應新的時間通常是相對於何時最後修改:

由於原始服務器並不總是提供明確的到期時間,高速緩存可以分配啓發式當沒有指定顯式時間時的到期時間,採用使用其他標題字段值(例如Last-Modified時間)的算法...如果響應具有Last-Modified標題字段([RFC7232]的第2.2節),則高速緩存鼓勵使用不超過自那時以來的間隔的一小部分的啓發式過期值。這個分數的典型設置可能是10%。 [https://tools.ietf.org/html/rfc7234#section-4.2.2]

This post詳細說明了不同瀏覽器如何計算該值。

1

新鮮生命期是根據幾個標題計算出來的。如果指定了「Cache-control:max-age = N」頭部,則新鮮度壽命等於N.如果該頭部不存在(常常是這種情況),則檢查是否存在Expires頭部。如果Expires標題存在,則其值減去Date標題的值確定新鮮度生存期。最後,如果兩個標題都不存在,請查找Last-Modified標題。如果此標頭存在,則所述高速緩存的新鮮度壽命等於日期頭的值減去上次修改標頭的10。

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ

+0

新鮮度只是緩存的一個元素。不能保證這是導致緩存被使用的因素。作爲一個便箋,這個鏈接可以在沒有國際化的情況下用於英文版本。 –

+0

沒有規則說只有在設置緩存控制或到期時纔會緩存文件。接收到的狀態碼爲200,203,206,300,301或410的響應可以由高速緩存存儲,並用於響應隨後的請求,並受制於到期機制,除非高速緩存控制指令禁止高速緩存。 – kouut

相關問題