2009-08-05 74 views
10

即使給每頁提供Cache-Control: no-cacheLast-Modified標題,IE也緩存太多的html是一個衆所周知的問題。隨機Querystring避免IE緩存

這behaiviour與查詢字符串努力讓動態信息時,因爲IE認爲它是同一頁(即:http://example.com/?id=10),並提供緩存的版本實在是令人擔憂。

我已經解決了它添加一個隨機數或時間字符串到查詢字符串(as others have done)這樣的http://example.com/?id=10&t=2009-08-06_13:12:56,我只是忽略serverside。

有更好的選擇嗎?還有其他更簡潔的方法來實現這一點嗎?我知道POST沒有被緩存,但在這裏使用GET在語義上是正確的。

+0

我在問:有沒有其他方法可以做到這一點? – voyager 2009-08-05 16:27:37

+0

順便說一句,你的斷言是不正確的。 IE不會「緩存太多的HTML」。有關IE中緩存的討論,請參閱www.fiddler2.com/redir/?id=httpperf。 – EricLaw 2010-04-05 21:38:06

+1

@Eric,IE有一些意外/不一致[行爲](http://support.microsoft.com/kb/222064/)[關於緩存](http://support.microsoft.com/kb/234067)。 – voyager 2010-04-05 21:55:17

回答

2

那麼,到底是使用 random, 或 time bound 查詢字符串的唯一可靠的方式做到這一點(感謝IE6)。

你可以使用一個 time bound querystring 僅更改每15秒(或任何其他的時間),所以你會降低服務器的命中次數,因爲你會看到本地緩存的內容對於那些15秒。

如果你有 a standard compliant browser,你可以只使用 ETags脫身。

+0

如果用戶使用後退按鈕返回到頁面並在頁面上進行刷新,則這又會失敗。你是否能夠找到一種在所有情況下都能正常工作的解決方案?謝謝。 – lostInTransit 2009-09-18 14:02:03

+0

您可以使用JavaScript客戶端生成查詢字符串的「隨機」部分,如http://stackoverflow.com/questions/1234246/random-querystring-to-avoid-ie-caching/1234260#1234260那樣,它將會不同*每次*完成get或post。 – voyager 2009-09-18 14:18:43

+0

「......(感謝IE6)是......」也感謝IE7,我還沒有測試IE8。 – 2010-06-08 12:41:03

0

我有同樣的問題,但保重,在一秒鐘內可以有很多請求。這就是爲什麼我用這個:

$.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...); 
+0

嗯,我不想**相同的客戶端**打我的服務器**幾個計時器每秒**,所以我不介意,如果信息顯示是1秒老。當然,輸出對於人類來說是純文本的。 – voyager 2009-08-05 16:18:46

2

的查詢字符串使用隨機數(不時間戳),或實際更改文件名是推薦的兩種方法。 Steve Souders和YAHOO!'s performance group已經發布了他們在優化世界上訪問量最大的房產之一時發現並開發的有用信息和實踐的

6

您也可以使用當前Unix的時間以毫秒爲單位,以避免在一秒鐘內的許多要求的問題(這是很可能在一毫秒的多個請求要少得多)

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime(); 
0

您是否嘗試過加入ETag響應中的標題? 您可以使用隨機的一個或生成的頁面的校驗和,以便在適當時提供緩存版本。

我不確定IE的行爲是什麼,但最近的版本應該可以工作。

又見HTTP RFC section on ETag

11

假設您使用的是jQuery,而不是使用$ .get或$ .getJson,請使用更通用的$ .ajax並顯式將緩存值設置爲false。下面是一個例子:

$.ajax({ 
     url: "/Controller/Action", 
     cache: false, 
     type: "GET", 
     dataType: "json", 
     success: function(data, textStatus) { 
         alert("success"); 
       } 
    }); 

需要多一點代碼(未雖然多)比使用.getJson或。獲得,但將乾淨地解決問題而不附加隨機數。

+0

我得到發現,在IE瀏覽器中使用GET請求,我們應該設置不緩存的HTML和我設置'緩存:假',並阻止IE從緩存帶來的結果..感謝 – Lucky 2013-07-01 06:53:34