2014-03-12 17 views
3

我想確保通過AJAX調用請求的數據是新鮮的,而不是高速緩存的。因此,我發送標題Cache-Control: no-cache強制高速緩存控制:在Chrome上通過XMLHttpRequest在F5上的no-cache重裝

但是,如果用戶按F5,我的Chrome版本33將覆蓋此標頭Cache-Control: max-age=0

例子。把你的網絡服務器上test.html與內容

<script> 
    var xhr = new XMLHttpRequest; 
    xhr.open('GET', 'test.html'); 
    xhr.setRequestHeader('Cache-Control', 'no-cache'); 
    xhr.send(); 
</script> 

在網絡選項卡中我看到的test.html AJAX調用上的鍍鉻調試器。狀態碼200.現在按F5重新加載頁面。有最大年齡:0,狀態代碼304未修改。

Firefox顯示類似的行爲。 Intead僅覆蓋請求頭,將其修改爲Cache-Control:no-cache,F5上的max-age = 0。

我可以壓制這個嗎?

回答

7

另一種方法是在url上附加一個唯一的數字。

<script> 
    var xhr = new XMLHttpRequest; 
    xhr.open('GET', 'test.html?_=' + new Date().getTime()); 
    //xhr.setRequestHeader('Cache-Control', 'no-cache'); 
    xhr.send(); 
</script> 

時間戳記不是很獨特,但它應該對您的用例足夠獨特。

+19

這不是真的。 [Cache-Control既是響應頭又是請求頭。](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4) – wadim

+0

@wadim因此,Chrome和Firefox並不尊重RFC 2616(現在7234)? –

+1

只是一個說明,這個答案是一個社區wiki,所以如果你覺得它沒有充分回答這個問題,隨時更新它。我沒有時間去重新審視它。 –

0

由於多種原因,使用查詢字符串進行緩存控制並不是您最好的選擇,並且(僅)在this answer中提到了一些(僅)幾個。他甚至解釋了新的標準版本控制方法。但如果你只是希望能夠設置你的請求頭,做了正確的方法是:

xhr.setRequestHeader('cache-control', 'no-cache, must-revalidate, post-check=0, pre-check=0'); 
xhr.setRequestHeader('cache-control', 'max-age=0'); 
xhr.setRequestHeader('expires', '0'); 
xhr.setRequestHeader('expires', 'Tue, 01 Jan 1980 1:00:00 GMT'); 
xhr.setRequestHeader('pragma', 'no-cache'); 

希望這有助於人的未來。