首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

CodeIgniter 跨目錄 Session 共享問題:改用 PHP 原生 Session 解決

     編輯:程式設計疑難解答

問題背景

CodeIgniter (CI) 應用中,視圖文件放在 CI 目錄外部(如 ../page/),控制器在 ../tool/application/controllers/。登錄成功後在控制器中寫入 CI Session,但外部視圖頁面無法讀取該 Session。

原因分析

  • CI 默認使用 Cookie-based Session(或文件/數據庫驅動),Session ID 存儲在 Cookie 中。
  • CI 的 Session 機制綁定於 $config['cookie_path'] 和 $config['cookie_domain'],默認僅在 CI 應用目錄下有效。
  • 外部視圖目錄不在 CI 的 Cookie 路徑範圍內,瀏覽器不發送 Session Cookie,導致無法識別會話。

解決方案:改用 PHP 原生 Session

// 在 CI 控制器或核心庫中初始化原生 Session
// 建議在 MY_Controller 構造函數或 config.php 中統一處理
if (session_status() === PHP_SESSION_NONE) {
    // 設置 Cookie 路徑為根目錄,確保全站共享
    session_set_cookie_params(0, '/'); 
    session_start();
}

// 寫入 Session
$_SESSION['user_id'] = $user_id;
$_SESSION['logged_in'] = true;

// 讀取 Session(外部視圖直接使用)
if (isset($_SESSION['logged_in']) && $_SESSION['logged_in']) {
    // 已登錄邏輯
}

關鍵配置

  1. session_set_cookie_params(0, '/'):設置 Cookie 路徑為根目錄 /,使所有子目錄均可訪問。
  2. 確保 php.ini 中 session.cookie_path = /。
  3. 若跨子域名,需設置 session.cookie_domain = .example.com。

對比總結

特性CI SessionPHP 原生 Session
跨目錄共享需額外配置 Cookie 路徑/域原生支持,設置路徑為 / 即可
安全性內置加密、旋轉機制需自行實現防劫持措施
分佈式擴展支持數據庫/Redis 驅動需自行實現或用扩展

對於簡單項目或視圖分離場景,直接使用 PHP 原生 Session 並設置 cookie_path=/ 是最快捷有效的方案。若需 CI Session 的高級特性,請正確配置 $config['cookie_path'] 和 $config['cookie_domain'] 並確保視圖域/路徑在覆蓋範圍內。

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