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

PHP Session 登出最佳實踐:單頁與框架頁面的跳轉處理

     編輯:PHP 綜合知識

前言

Session 是 PHP 無狀態 HTTP 中維持登入狀態的標準機制。登出看似簡單(`session_destroy()`),實際上涉及 Session 資料銷毀、Cookie 清理、快取控制、頁面跳轉方式(特別是 `iframe` 框架頁)等細節。本文整理完整的登出最佳實踐,並解決框架頁跳轉失效的常見問題。

核心登出流程

<?php
// logout.php
// 1. 啟動 Session(必須在輸出前)
session_start();

// 2. 清空 $_SESSION 陣列(可選,destroy 會移除伺服器端檔案)
$_SESSION = [];

// 3. 刪除 Session Cookie(預設名稱 PHPSESSID)
if (ini_get('session.use_cookies')) {
    $params = session_get_cookie_params();
    setcookie(
        session_name(),
        '',
        time() - 42000,
        $params['path'],
        $params['domain'],
        $params['secure'],
        $params['httponly']
    );
}

// 4. 銷毀伺服器端 Session 檔案
session_destroy();

// 5. 防止瀏覽器快取登出後頁面
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');

// 6. 輸出跳轉腳本
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>正在登出...</title>
</head>
<body>
    <script>
        alert('您已成功登出!');
        // 關鍵:頂層視窗跳轉,支援 iframe 框架頁
        (window.top || window).location.href = 'login.php';
    </script>
    <noscript>
        <meta http-equiv="refresh" content="1;url=login.php">
        請啟用 JavaScript 或 <a href="login.php">點此登入</a>。
    </noscript>
</body>
</html>

框架頁(iframe)跳轉問題深度解析

錯誤寫法

// 僅在 iframe 內部跳轉,父頁面不變
location.href = 'login.php';
// 或
window.location.href = 'login.php';

正確寫法

// 強制頂層視窗跳轉
parent.location.href = 'login.php';
// 或更通用(支援多層巢狀 iframe)
top.location.href = 'login.php';
// 現代寫法(避免跨域錯誤)
(window.top || window).location.href = 'login.php';

原理說明

  • window:當前 iframe 視窗
  • parent:直接父視窗
  • top:最頂層視窗(瀏覽器分頁)
  • 若登出頁面在 `