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

PHP Session 導致瀏覽器返回鍵表單資料清空的解決方法

     編輯:PHP 相關知識

session_start() 強制禁用快取導致回退資料遺失

現象:使用者填寫表單送出 → 發現錯誤 → 按瀏覽器「上一頁」 → 所有輸入欄位變空白。

根因

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 要求過期後必須向伺服器驗證
  • 此組合兼顧「敏感頁面不被 Proxy 快取」與「使用者返回保留表單資料」

完整範例

<?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() 前
  • HTTPS 頁面預設不快取,加上此標頭可啟用瀏覽器快取

一行標頭設定,即可解決使用者返填表單資料遺失的困擾。

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