Released 2023-06-29

Modified 2023-06-29

Tech

1555Words (8min read)

如何防止瀏覽器快取(Cache)?

Title Image

Photo by Patrick Perkins on Unsplash

前言 - Prologue

隨著網頁內容的日益豐富和動態化,防止瀏覽器快取成為了開發者不可忽視的一環。

瀏覽器快取的工作原理是將網頁的資源存儲在本地,這在某些情況下可能導致用戶看到過時的內容與樣式。

因此,我們需要一些方法來控制瀏覽器的快取行為,確保用戶總是獲取到最新的內容。

本文將探討瀏覽器快取的工作原理、對網站和應用程式的影響,以及一些可行的解決方案。

正文 - Main text

如前言所述,瀏覽器快取的工作原理是將網頁的資源存儲在本地,它會儲存一些較小的資源,例如圖片、腳本和樣式表,這樣在下次請求同一個資源時,就可以直接從快取中獲取,而不需要重新下載。這有助於提升網站的載入速度和性能,以提升用戶體驗,但也可能導致用戶看到過時的內容。

Web 端並不像 App 端一樣可以達到清除快取的功能,而雖然我們無法完整的清除瀏覽器的快取,但如果希望在網頁中進行更新並確保用戶看到最新的內容,除非更改 HTML 編碼、操作瀏覽器自身後台的清除快取,或是使用無痕模式,否則沒有直接的方法可以永久清除快取。

快取對網站和應用程式的影響

對於那些需要頻繁更新內容的網站和應用程式來說,瀏覽器快取可能是一個問題。用戶可能會看到舊版本的內容,而不是最新的內容。這可能對用戶體驗和功能的正確性產生負面影響。

防止瀏覽器快取的方法

以下是一些常見的方法和技巧,可以幫助我們防止瀏覽器快取:

1.禁用快取: 將下列程式碼插入在網頁的 <head> 標籤之間。

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

這些指示告訴瀏覽器不要快取頁面的內容,並在每次請求時重新驗證頁面。

2.隨機化URL: 在每個網頁的URL參數中添加隨機值、版本號或時間戳,確保每次請求都是唯一的,從而避免使用快取。

# 隨機值
<img src="image.jpg?version=12345">

# 版本號
<link rel="stylesheet" href="styles.css?v=1.1">
<script src="script.js?v=1.2"></script>
# 時間戳
var url = "example.com/data?timestamp=" + new Date().getTime();

每次版本號更改時,瀏覽器將重新下載圖像。

在 AJAX 請求中禁用快取時,也可以添加一個隨機參數或者一個時間戳到 URL 中,確保每次請求都是唯一的。像是上方時間戳範例可導致每次請求都有一個新的時間戳,從而避免瀏覽器快取。

3.使用伺服器端快取控制: 在伺服器端設定中,可以使用特定的標頭來控制瀏覽器快取行為。

例如,在 Apache 伺服器上,可在 .htaccess 檔案中加入以下指令:

<FilesMatch "\.(html|js|css)$">
    FileETag None
    <IfModule mod_headers.c>
        Header unset ETag
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
    </IfModule>
</FilesMatch>

防呆筆記:

<FilesMatch "\.(html|js|css)$">:這是一個檔案匹配規則,它指定了要應用以下標頭設定的檔案類型,即以 .html.js.css 為副檔名的檔案。

FileETag None:此指令用於關閉檔案的 ETag(實體標籤),這是一種用於快取驗證的機制。

<IfModule mod_headers.c>:此指令用於確保 mod_headers 模組已經載入。

Header unset ETag:此指令將移除 ETag 標頭,以確保瀏覽器不使用 ETag 進行快取驗證。

Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate":此指令設定了 Cache-Control 標頭,其中包含了幾個指示,包括不要快取(no-cache)、不要儲存(no-store)以及必須重新驗證(must-revalidate)。

Header set Pragma "no-cache":此指令設定了 Pragma 標頭,指示瀏覽器不要快取該資源。

Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT":此指令設定了 Expires 標頭,將過期時間設定為過去的一個日期,從而確保瀏覽器認為該資源已過期,需要重新載入。

在PHP中,可使用以下程式碼:

header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");

這些指令會告訴瀏覽器不要快取符合檔案類型的頁面,可以有效地控制特定檔案類型的快取行為,確保每次請求都從伺服器獲取最新的資源。

4.使用 JavaScript 控制: 使用 JavaScript 在頁面載入時清除瀏覽器快取,強制瀏覽器重新載入頁面。

window.onload = function() {
  location.reload(true);
};

這將強制瀏覽器重新載入頁面並忽略快取。

5.使用 POST 方法: 在發送 AJAX 請求時,將 HTTP 方法設定為 POST 而不是 GET。由於 POST 請求通常不會被瀏覽器快取,因此可以確保每次請求都能從伺服器獲取最新的內容。

var xhr = new XMLHttpRequest();
xhr.open("POST", "example.com/data", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send();

題外話:HTTP content-type 教學 --> https://www.runoob.com/http/http-content-type.html

6.文件指紋: 生成唯一的文件指紋,可以將其附加到 Script 和 CSS 檔案的 URL 中。每次文件更改時,指紋都會改變,從而防止瀏覽器使用舊版本的檔案。

後記 - Epilogue

瀏覽器快取是提升網站性能的重要工具,但對於需要頻繁更新內容的網站和應用程式來說,它可能導致用戶看到過時的內容。

通過禁用快取、隨機化 URL、使用伺服器端快取控制和 JavaScript 控制,我們可以有效地防止瀏覽器快取,確保用戶總是獲取到最新的內容。

選擇合適的方法和技巧,根據需求和應用程式的特性來控制瀏覽器的快取行為,這將有助於提升用戶體驗和確保內容的及時性。

Read more from Tech
lightbox-image
Toggle Button - Red Pandas Icons by svgrepo.com

Copyrights © 2023 Kama, All Rights Reserved.