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'); ?> 我的测试页面是这样的: <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,它会再次进入服务器(这是错误的).演示序列(假设全部在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |