我有以下代码:
<?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页面。
为什么?
答案 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");