首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

HTTP 快取控制:強制瀏覽器向伺服器請求最新內容

     編輯:PHP 相關知識

應用場景

動態頁面、API 介面、使用者個人化內容等,必須確保瀏覽器不使用本地快取,每次都向伺服器請求最新資料。

完整 Header 設定

<?php
// 1. 設定過期時間為過去時間
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// 2. Last-Modified 設為當前 GMT 時間
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// 3. HTTP/1.1 標準快取控制
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false); // 相容舊版 IE

// 4. HTTP/1.0 相容
header("Pragma: no-cache");

// 5. 針對 HTTPS/代理伺服器的額外防護
header("Vary: *");
?>

各 Header 作用對照表

HeaderHTTP 版本作用
Expires1.0/1.1指定內容過期時間,設為過去即強制過期
Cache-Control1.1核心控制指令:no-store 不儲存、no-cache 驗證後使用、must-revalidate 必須驗證
Pragma1.0舊版相容,no-cache 效果同 Cache-Control
Last-Modified1.0/1.1配合 If-Modified-Since 進行條件請求
Vary1.1告知代理伺服器根據請求標頭(如 Cookie、Accept-Language)區分快取版本

常見誤區

  • 只設 Cache-Control: no-cache:瀏覽器仍可能儲存內容,只是使用前會驗證。需加 no-store 禁止儲存。
  • 靜態資源(CSS/JS/圖片)也加上這些 Header:會導致效能大幅下降。靜態資源應設定長期快取(max-age=31536000)並配合檔名雜湊版本控制。
  • 在 session_start() 之後設定:Session 預設會送出 Cache-Control: no-store, no-cache, must-revalidate,但建議在 session_start() 前顯式設定以確保一致性。

Nginx / Apache 全域設定

# Nginx
location /api/ {
    add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
    add_header Pragma "no-cache";
    add_header Expires "Mon, 26 Jul 1997 05:00:00 GMT";
}

# Apache (.htaccess)
<IfModule mod_headers.c>
    Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
    Header set Pragma "no-cache"
    Header set Expires "Mon, 26 Jul 1997 05:00:00 GMT"
</IfModule>

結語

快取控制是前後端協作的關鍵。動態內容務必加上完整防快取 Header;靜態資源則應積極快取並透過版本號管理更新。理解 HTTP 快取機制,能有效解決「改了程式碼瀏覽器不更新」的經典問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved