首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP/Ajax“变化:X请求-With”不适用于我!

PHP/Ajax“变化:X请求-With”不适用于我!
EN

Stack Overflow用户
提问于 2011-02-23 13:45:12
回答 1查看 1.7K关注 0票数 4

我试图提供可缓存的内容,这取决于它是否是ajax请求。

设想情况:

PHP脚本"/test.php“提供了一些HTML,并设置了以下标题:

代码语言:javascript
复制
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头)请求相同的资源时,我的Firefox并不请求服务器,而是提供来自缓存的(错误的)响应!

另一方面,也是一样的。对资源的Ajax调用填充缓存,随后的浏览器请求提供来自缓存的(错误)响应。

有人有这个话题的经验吗?我认为这应该是一个足够普遍的问题服务内容,这取决于它的ajax是否(在同一个URL上)。

你好,Ilja

EN

回答 1

Stack Overflow用户

发布于 2011-04-16 19:22:21

我可以再现这一点,但前提是我不包括所请求的X-在ajax响应中包含标头。如果我为ajax调用设置了头部,那么它的工作方式基本上和预期的一样,尽管ajax调用清除了常规请求的缓存,反之亦然--内容没有被缓存,但是您永远不会得到错误的内容。

我的PHP文档如下所示:

代码语言:javascript
复制
<?
    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');
?>

我的测试页面是这样的:

代码语言:javascript
复制
<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年代内):

代码语言:javascript
复制
Reg  : server
Reg  : cache
Reg  : cache
Reg  : cache
Ajax : server
Ajax : cache
Reg  : server
Ajax : server

其结果是,如果您希望在通过ajax提供服务时以不同的方式可靠地缓存事物,那么在发出ajax请求时使用不同的URL (?ajax=1可以正常工作)。

我正在测试FF4.0的最新版本

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5091701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档