2015-10-05 177 views
3

我有以下代码:Ajax请求相同的URL

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

这是为什么?

+2

这是*的Chrome版本45.0.2454.101米重复性( 64位)* – Rayon

回答

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");