2015-10-05 234 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");