我可以重现这一点,但前提是我不在 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');
?>
我的测试页面是这样的:
<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