x requested with php,PHP / Ajax“Vary:X-Requested-With”对我不起作用!
我正在嘗試提供可緩存的內容,具體取決于它是否是ajax請求.
場景:
一個小的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時,我得到輸出,并且對于下一分鐘,我從Browser-Cache獲得相同的結果,而不是命中服務器.好的,到目前為止.
當我通過XMLHttpRequest(使用X-Requested-With:XMLHttpRequest Header)請求相同的資源時,我的Firefox不會請求服務器,而是提供來自Cache的(錯誤)響應!
換句話說,它是一樣的.資源上的Ajax-Call填充緩存,后續的Browser-Request服務于Cache的(錯誤)響應.
有沒有人有這方面的經驗?我認為這應該是一個很常見的問題 – 根據是否是ajax(在同一個URL上)提供內容.
問候,Ilja
解決方法:
我可以重現這個,但前提是我沒有在ajax響應中包含X-Requested-With標頭.如果我為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');
?>
我的測試頁面是這樣的:
load into frame
load into div via ajax
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;
}
當我點擊第一個鏈接時,它會從服務器請求.當我再次點擊它時,它來自緩存.每次后續點擊都來自緩存,最多60秒.
當我點擊第二個鏈接時,請求將轉到服務器.當我再次點擊它時,它來自緩存.每次后續點擊都來自緩存,最多60秒.
如果我點擊鏈接1,然后鏈接2,它們都會進入服務器.如果我再次點擊鏈接1,它會再次進入服務器(這是錯誤的).演示序列(假設全部在60s內):
Reg : server
Reg : cache
Reg : cache
Reg : cache
Ajax : server
Ajax : cache
Reg : server
Ajax : server
結果是,如果你想通過ajax服務時可靠地緩存不同的東西,在發出ajax請求時使用不同的URL(?ajax = 1可以正常工作).
我正在測試最新的FF 4.0
標簽:php,ajax,caching,header,vary
來源: https://codeday.me/bug/20190710/1420516.html
總結
以上是生活随笔為你收集整理的x requested with php,PHP / Ajax“Vary:X-Requested-With”对我不起作用!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Teams的manifest文件开始支持
- 下一篇: 使用Adaptive cards来构建T