2011-02-23 72 views
4

我正在嘗試提供可緩存內容,具體取決於它是否是ajax請求。PHP/Ajax「Vary:X-Requested-With」不適用於我!

場景:

小PHP腳本 「/test.php」 提供一些HTML的輸出,並設置以下標題:

Expires   Wed, 23 Feb 2011 13:30:06 GMT 
Cache-Control public, max-age=60 
Vary   X-Requested-With,Accept-Encoding 

的輸出取決於$_SERVER['HTTP_X_REQUESTED_WITH']狀態。

當我的Firefox指向Url時,我得到輸出,而對於下一個分鐘,我從瀏覽器緩存中得到相同的結果,而不是擊中服務器。好的,到目前爲止。

當我通過XMLHttpRequest(與X-Requested-With: XMLHttpRequest標題)請求相同的資源時,我的Firefox不會請求服務器,但會提供Cache的(錯誤)響應!

對於其他方式,它是相同的。資源上的Ajax-Call會填充緩存,並且後續的瀏覽器請求會緩存來自緩存的(錯誤)響應。

有沒有人有這方面的經驗?我認爲這應該是一個普遍的問題 - 根據是否使用ajax提供內容(在同一個URL上)。

問候,ILJA

+0

Firefox甚至不發送初始Ajax請求? – Gumbo 2011-04-16 19:38:00

回答

0

我可以重現這一點,但只有當我不包括X-要求,隨着Ajax響應頭。如果我爲ajax調用設置標頭,它將按預期工作,大部分爲,但ajax調用會清除緩存中的常規請求,反之亦然 - 內容不會被緩存,但您永遠不會收到錯誤的內容。

我的PHP文檔看起來是這樣的:

<? 
    putenv('TZ=PST8PDT'); 
    date_default_timezone_set('America/Los_Angeles'); 

    header('Expires: '.gmdate("D, d M Y H:i:s").' GMT'); 
    header('Cache-Control: public, max-age=60'); 
    header('Vary: X-Requested-With,Accept-Encoding'); 

    echo 'it is now '.date('Y-m-d H:i:s'); 
?> 

而且我的測試頁是這樣的:

<a href="resource.php" target="ifr">load into frame</a><br /> 
<iframe name="ifr" width="400" height="100"></iframe> 

<hr /> 

<a href="#" onclick="return load();">load into div via ajax</a><br /> 
<div id="di" style="border: 1px solid black; width: 400px; height: 100px;"></div> 

<script> 

function load(){ 

    var req = new XMLHttpRequest(); 
    req.onreadystatechange = function(){ 

     if (req.readyState == 4){ 
      document.getElementById('di').textContent = req.responseText; 
     } 
    } 

    req.open('GET', 'resource.php', 1); 
    req.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    req.send(null); 

    return false; 
} 

</script> 

當我打的第一個環節,它從服務器請求。當我再次擊中它時,它來自緩存。隨後的每次點擊均來自緩存,長達60秒。

當我點擊第二個鏈接時,請求會進入服務器。當我再次擊中它時,它來自緩存。隨後的每次點擊均來自緩存,長達60秒。

如果我點擊鏈接1,然後鏈接2,他們都去服務器。如果我再次點擊鏈接1,它會再次進入服務器(這是錯誤的)。演示序列(假設全部在60秒):

Reg : server 
Reg : cache 
Reg : cache 
Reg : cache 
Ajax : server 
Ajax : cache 
Reg : server 
Ajax : server 

其結果是,如果你想可靠的高速緩存不同的事情時,通過AJAX服務,使用使得AJAX請求時不同的URL(AJAX = 1將做工精細)。

我在FF 4.0上測試最新

+0

x-requested-with對於在同一個URL上標識ajax請求是強制性的。我想根據RESTFUL接口在同一個URL上提供不同的內容。 – Ilja 2011-04-18 07:30:32

+0

答案是......你可以,但它不會正確緩存。演示代碼是否按預期爲您工作? – Cal 2011-04-18 08:22:51