現象:使用者填寫表單送出 → 發現錯誤 → 按瀏覽器「上一頁」 → 所有輸入欄位變空白。
session_start() 預設發送以下快取控制標頭:
Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Expires: Thu, 19 Nov 1981 08:52:00 GMT
導致瀏覽器不快取頁面,返回時重新請求伺服器,原 POST 資料遺失。
在 session_start() 之後、任何輸出之前加入:
<?php
session_start();
header('Cache-Control: private, must-revalidate'); // 允許私有快取
// 或
header('Cache-Control: private'); // 簡寫
?>
private 指示瀏覽器可快取,但禁止共用快取 (Proxy/CDN)must-revalidate 要求過期後必須向伺服器驗證<?php
// 1. 啟動 Session
session_start();
// 2. 立即調整快取標頭 (必須在任何輸出前)
header('Cache-Control: private, must-revalidate');
// 3. 表單處理邏輯
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 驗證...
if ($errors) {
// 重新顯示表單,使用者按返回鍵會看到剛才輸入的資料
}
}
?>
<form method="post">...</form>
header() 必須在 session_start() 之後呼叫,否則會被 Session 模組覆蓋session_cache_limiter() 可集中設定:session_cache_limiter('private'); 放在 session_start() 前一行標頭設定,即可解決使用者返填表單資料遺失的困擾。