Ajax请求到同一个url

时间:2015-10-05 10:59:57

标签: javascript php json ajax

我有以下代码:

<?php
function isAjaxRequest() {
    return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}

var_dump(isAjaxRequest());

if (isAjaxRequest()) {
    echo json_encode(['ajax' => true]);
    exit(0);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
    Test
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    <script>
        $(function () {
            $.get("/", function () {
                console.log(arguments);
            });
        });
    </script>
</body>
</html>

当我按 Ctrl + W (关闭标签)然后 Ctrl + Shift + T (重新打开刚刚关闭的标签页)时,我得到了JSON响应HTML页面。

为什么?

1 个答案:

答案 0 :(得分:3)

当您重新打开关闭的选项卡时,允许浏览器重用给定URL的缓存中的数据来填充窗口。由于缓存中的数据来自ajax请求响应,它使用的是什么,并且您看到了JSON。

这就引出了一个问题:为什么浏览器在满足ajax请求时没有使用缓存中的HTML?浏览器使用不同的规则来确定是否使用缓存内容,具体取决于他们正在做什么。在这种情况下,Chrome似乎很乐意在还原最近关闭的标签时重复使用它,而不是在执行ajax请求时。

您可以通过告诉浏览器从不缓存响应来更正它。这是否可取取决于您的使用案例。

例如,在文件顶部插入这些文件(当然是在打开<?php标记之后),这对我来说不会发生:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");