使用者上傳圖片後,URL 不變(同一路徑覆蓋)。首次上傳正常顯示,但連續快速上傳多張圖片時,瀏覽器仍顯示舊圖片或更早版本,無法載入最新上傳的圖片。
瀏覽器對同一 URL 請求會發送 If-Modified-Since 標頭,包含上次請求資源的最後修改時間(精確到秒)。流程如下:
If-Modified-Since: <上次修改時間>問題關鍵:修改時間精確到「秒」。若上傳操作極快(同一秒內多次覆蓋),伺服器判定修改時間未變,返回 304,瀏覽器繼續顯示舊快取。
在請求 URL 後附加隨機參數(或時間戳、版本號),強制瀏覽器視為新資源:
// JavaScript 範例 var imgUrl = "https://example.com/static/img/avatar.png?r=" + Math.random(); // 或使用時間戳 var imgUrl = "https://example.com/static/img/avatar.png?v=" + Date.now();
| 方案 | 優點 | 缺點 |
|---|---|---|
| Math.random() | 簡單,每次請求唯一 | 無法利用快取,每次都重新下載 |
| 時間戳 | 同一秒內請求可能重複 | 同上 |
| 版本號/檔案雜湊 | 內容不變時可快取,內容變更自動更新 | 需後端支援生成版本或雜湊 |
在伺服器端 (Nginx/Apache/Tomcat) 針對上傳圖片目錄設定:
# Nginx 範例:禁用快取或短期快取
location /uploads/ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
此方法同樣適用於:
iframe 載入同一 URL 內容不更新「URL 不變、內容變」是經典快取陷阱。前端加隨機參數最快見效;長期專案建議引入「檔案指紋/版本號」機制,兼顧快取效能與更新即時性。