【问题标题】:Ajax request to the same url [duplicate]对同一网址的 Ajax 请求 [重复]
【发布时间】:2015-10-05 10:59:57
【问题描述】:

我有以下代码:

<?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 页面。

这是为什么呢?

【问题讨论】:

  • 它可以在 Chrome 版本 45.0.2454.101 m (64-bit) 中重现

标签: javascript php json ajax


【解决方案1】:

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

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

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

例如,将这些插入文件顶部(当然是在打开的&lt;?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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2018-06-25
    • 2011-10-30
    相关资源
    最近更新 更多