瀏覽器對 GET 請求預設啟用快取,導致相同參數請求返回舊資料。本文提供四種解決方案,涵蓋前端與後端。
// jQuery
$.ajax({
url: '/api/data',
data: { t: Date.now() }, // 或 Math.random()
// ...
});
// 原生 fetch
fetch('/api/data?t=' + Date.now())
.then(res => res.json());
If-Modified-Since: 0// jQuery
$.ajax({
url: '/api/data',
headers: { 'If-Modified-Since': '0' },
// ...
});
// XMLHttpRequest
xhr.setRequestHeader('If-Modified-Since', '0');
<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // 過去時間
header('Pragma: no-cache');
// 輸出 JSON...
?>
cache: false 選項$.ajax({
url: '/api/data',
cache: false, // 內部自動加 _=timestamp 參數
success: function(data) { ... }
});
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 隨機參數 | 通用、無需後端配合 | URL 變長、日誌較雜 | 大多數 GET 請求 |
| If-Modified-Since | 標準 HTTP 機制 | 部分舊瀏覽器/代理可能忽略 | 需精確控制快取驗證 |
| 後端標頭 | 徹底禁用、無前端依賴 | 影響所有客戶端、可能阻礙合理快取 | 極機密資料、即時資訊 |
| jQuery cache:false | 程式碼簡潔 | 僅限 jQuery、GET 有效 | jQuery 專案快速接入 |
HTTP 標準規定 POST 不快取,但部分舊版 IE 仍會快取 POST。建議統一加上 Cache-Control: no-cache 回應標頭。