这个问题已经在这里有了答案: > “Re open last closed tab” causing to show last ajax request content 3个
我有以下代码:
<?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页面.
这是为什么?
解决方法:
当您重新打开一个关闭的选项卡时,浏览器将被允许重新使用给定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");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。