在Ajax响应上设置vary头时,不会从缓存中传递响应

时间:2016-03-02 08:32:12

标签: javascript php ajax browser browser-cache

我遇到了缓存ajax响应的一些问题。

我设法得到一个小的测试用例,可以重现我遇到的问题。

我在Firefox 44.0.2,Chrome 48.0.2564.116 m,Opera 35.0.2066.92和Edge 25.10586.0.0中进行了测试

我的index.html

<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core-compat.js"></script>
    <script>
        var Call1 = new Request({
            url: 'Ajax.php',
            onSuccess: function(){

                setTimeout(function(){

                    var Call2 = new Request({
                        url: 'Ajax.php'
                    });

                    Call2.setHeader('Accept-Language', 'fr-FR');
                    Call2.get();
                }, 1000);
            }
        });

        Call1.setHeader('Accept-Language', 'en-GB');
        Call1.get();
    </script>
</head>
</html>

我的Ajax.php

<?php

header('Cache-Control: max-age=3600');
header('Expires: ' . date('D, d M Y H:i:s T', time() + 3600));
header('Last-Modified: ' . date('D, d M Y H:i:s T', time()));
header('Vary: Accept-Language');

$headers = getallheaders();

echo $headers['Accept-Language'];

问题

这些ajax响应不会在页面访问之间缓存。他们总是会点击Ajax.php,甚至不会发送if-modified-since标题。

然而

当我将请求的Accept-Language标头更改为相同的语言时,它会在页面访问之间缓存请求。所以它似乎根本不会起作用。

当我确实有不同的Accept-Language标头但不发回Vary标头时,它也会缓存响应。但是缓存的响应始终是第一个,因为它在缓存时不会考虑Accept-Language标头。

有人知道这是浏览器问题还是我做错了什么?

提前致谢。

PS:我知道按F5也会重新请求ajax请求,按url栏中的enter不会。

0 个答案:

没有答案