Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/Ajax“;更改:X-request-With";不适合我!_Php_Ajax_Caching_Header_Vary - Fatal编程技术网

PHP/Ajax“;更改:X-request-With";不适合我!

PHP/Ajax“;更改:X-request-With";不适合我!,php,ajax,caching,header,vary,Php,Ajax,Caching,Header,Vary,我试图根据是否是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 输出取决于$\u服务器['HTTP\u X\u REQUESTED\u WITH']状态 当我的Firef

我试图根据是否是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
输出取决于
$\u服务器['HTTP\u X\u REQUESTED\u WITH']
状态

当我的Firefox指向Url时,我得到了输出,接下来的一分钟,我从浏览器缓存中得到了相同的结果,没有命中服务器。好的,到目前为止

当我通过
XMLHttpRequest
(带有
X-request-with:XMLHttpRequest
头)请求相同的资源时,我的Firefox不会请求服务器,而是从缓存中提供(错误的)响应

反过来说,也是一样的。对资源的Ajax调用将填充缓存,随后的浏览器请求将为来自缓存的(错误)响应提供服务

有没有人有这方面的经验?我认为这应该是一个很常见的问题——服务内容取决于它是否是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>
结果是,如果您希望在通过ajax提供服务时以不同的方式可靠地缓存内容,那么在发出ajax请求时使用不同的URL(?ajax=1可以正常工作)


我正在测试FF 4.0最新版本

Firefox甚至没有发送初始Ajax请求?x-requested-with对于在同一URL上识别Ajax请求是必需的。我想根据RESTFUL界面在同一个URL上提供不同的内容。答案是。。。可以,但它无法正确缓存。演示代码是否未按预期为您工作?
Reg  : server
Reg  : cache
Reg  : cache
Reg  : cache
Ajax : server
Ajax : cache
Reg  : server
Ajax : server