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

CodeIgniter config.php 核心配置項深度解析與動態修改技巧

     編輯:PHP 綜合知識

前言:配置是應用行為的基因

application/config/config.php 是 CodeIgniter 應用的中樞神經,控制著語系、編碼、安全、日誌、Hook、類別前綴等核心行為。本文逐項解析關鍵配置項,並示範運行時動態修改技巧。

關鍵配置項詳細說明

配置項預設值作用注意事項與最佳實踐
base_url''網站根網址 (含 index.php)必填。生產環境設為完整 HTTPS 網址,結尾不加斜線。base_url() 輔助函數依賴此值。
index_page'index.php'索引頁面名稱配合 .htaccess 隱藏 index.php 時設為 ''。影響 site_url() 輸出。
uri_protocol'REQUEST_URI'URI 獲取方式可選:AUTO, REQUEST_URI, QUERY_STRING, PATH_INFO。NGINX 通常用 REQUEST_URI。
url_suffix''URL 統一後綴如 .html 產生偽靜態效果。影響所有 site_url()、anchor()。
language'english'預設語系目錄名若設為 chinese,需將 system/language/english/ 複製為 chinese/ 並翻譯,否則核心類庫錯誤訊息找不到語系檔報錯。
charset'UTF-8'系統字元編碼全站統一 UTF-8。資料庫連線、HTML meta、PHP 預設編碼三者必須一致。
enable_hooksFALSE啟用 Hook 系統需為 TRUE 才能使用 application/config/hooks.php。輕微效能影響。
subclass_prefix'MY_'核心擴展類前綴修改後需同步更新所有 MY_ 類別檔名與類別名。建議保持預設避免混淆。
permitted_uri_chars'a-z 0-9~%.:_-'URI 允許字元正則需包含應用使用的所有字元。中文網址需加入 Unicode 範圍或改用 PATH_INFO 模式。
log_threshold0日誌等級 (0-4)0=關閉, 1=錯誤, 2=除錯, 3=資訊, 4=所有。生產建議 1,開發建議 4。需確保 application/logs/ 可寫入。
log_path''日誌儲存路徑留空則用 application/logs/。建議設為絕對路徑 /var/log/ci/ 便於 logrotate 管理。
log_file_permissions0644日誌檔權限生產環境設 0640,確保 Web 用戶可寫、日誌用戶可讀。
proxy_ips''信任代理 IP 列表使用 CDN/負載平衡器時必填。逗號分隔。影響 $this->input->ip_address() 取得真實客戶 IP。
encryption_key''加密金鑰生產環境必填 32 字元隨機字串。用於 Session 加密、Encrypt Library。洩漏將導致 Session 劫持、資料解密。
composer_autoloadFALSE載入 Composer autoload設為 TRUE 或 vendor/autoload.php 路徑。啟用後可直接使用 Composer 套件。
csrf_protectionFALSE啟用 CSRF 保護設為 TRUE 後,所有 POST 表單需包含 。AJAX 需在 header 送出 X-CSRF-TOKEN。
csrf_token_name'csrf_test_name'CSRF Token 名稱建議改為專案專屬名稱如 csrf_token。
csrf_cookie_name'csrf_cookie_name'CSRF Cookie 名稱同上。
csrf_expire7200CSRF Token 過期秒數配合 Session 過期時間設定。

動態讀取與修改配置

1. 輔助函數 config_item() (唯讀)

$charset = config_item('charset'); // 返回 'UTF-8'
$csrf = config_item('csrf_protection'); // 返回 TRUE/FALSE

2. Config 類別實例 (可讀寫)

// 讀取
$charset = $this->config->item('charset');

// 修改 (僅影響當前請求)
$this->config->set_item('csrf_protection', FALSE); // 關閉特定頁面 CSRF
$this->config->set_item('language', 'chinese');    // 動態切換語系

// 取得所有配置陣列
$all_config = $this->config->config; // 參考傳回,修改會影響全域

3. 實戰場景:動態關閉 CSRF 保護

class Api extends CI_Controller {
    public function __construct() {
        parent::__construct();
        // API 端點使用 Token 驗證,關閉 CSRF
        if (strpos($this->uri->uri_string(), 'api/') === 0) {
            $this->config->set_item('csrf_protection', FALSE);
        }
    }
}

4. 實戰場景:多語系動態切換

class MY_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $lang = $this->session->userdata('lang') ?: 'english';
        $this->config->set_item('language', $lang);
        $this->lang->load('common', $lang); // 載入對應語系檔
    }
}

配置檔分離與環境管理

環境專屬配置

application/config/
├── config.php              # 共用配置
├── development/
│   └── config.php          # 開發環境覆蓋 (log_threshold=4, csrf_protection=FALSE)
├── production/
│   └── config.php          # 生產環境覆蓋 (log_threshold=1, encryption_key=xxx)
└── testing/
    └── config.php          # 測試環境覆蓋

CI 根據 ENVIRONMENT 常數 (預設從 $_SERVER['CI_ENV'] 讀取) 自動載入對應目錄配置覆蓋基礎配置。

敏感配置外部化

// config.php
$config['encryption_key'] = getenv('CI_ENCRYPTION_KEY') ?: 'dev_default_key_32chars_long!!';
$config['database'] = [
    'default' => [
        'hostname' => getenv('DB_HOST') ?: 'localhost',
        'username' => getenv('DB_USER') ?: 'root',
        'password' => getenv('DB_PASS') ?: '',
        'database' => getenv('DB_NAME') ?: 'myapp',
    ]
];

生產環境透過 Web Server (Apache SetEnv / Nginx fastcgi_param) 或 Docker/K8s 環境變數注入,程式碼零敏感資訊。

自定義配置檔

建立 application/config/payment.php:

$config['ecpay'] = [
    'merchant_id' => '2000132',
    'hash_key'    => '5294y06JbISpM5x9',
    'hash_iv'     => 'v77hoKGq4kWxNNIS',
    'url'         => 'https://payment.ecpay.com.tw/Cashier/AioCheckOut/V5',
];
$config['newebpay'] = [ ... ];

載入使用:

$this->config->load('payment'); // 載入到 $this->config->config['ecpay']
$ecpay = $this->config->item('ecpay'); // 取得單項
// 或
$this->config->load('payment', TRUE); // 載入到 $this->config->payment['ecpay'] (第二參數 TRUE 為命名空間)
$ecpay = $this->config->item('ecpay', 'payment');

常見配置錯誤排查

現象可能原因解決
base_url() 輸出錯誤base_url 未設或結尾有斜線設定完整網址,無尾隨斜線
語系檔找不到language 設為非 english 但未複製語系目錄複製 system/language/english 到對應目錄並翻譯
CSRF 驗證失敗AJAX 未送 Token / 表單缺 csrf_field()檢查前端是否包含 Token,或動態關閉該路由 CSRF
日誌不寫入log_threshold=0 或 logs/ 不可寫設定 threshold > 0,chmod 775 logs/
取得 IP 錯誤使用 CDN 未設 proxy_ips填入 CDN/Load Balancer IP 範圍

總結

config.php 是應用行為的控制台,**理解每個配置項的副作用、環境區隔策略、動態修改時機** 是 CI 開發者必修課。建立「配置即代碼」文化:敏感值環境變數化、環境差異目錄化、業務配置檔案化、動態修改局部化。

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