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_hooks | FALSE | 啟用 Hook 系統 | 需為 TRUE 才能使用 application/config/hooks.php。輕微效能影響。 |
subclass_prefix | 'MY_' | 核心擴展類前綴 | 修改後需同步更新所有 MY_ 類別檔名與類別名。建議保持預設避免混淆。 |
permitted_uri_chars | 'a-z 0-9~%.:_-' | URI 允許字元正則 | 需包含應用使用的所有字元。中文網址需加入 Unicode 範圍或改用 PATH_INFO 模式。 |
log_threshold | 0 | 日誌等級 (0-4) | 0=關閉, 1=錯誤, 2=除錯, 3=資訊, 4=所有。生產建議 1,開發建議 4。需確保 application/logs/ 可寫入。 |
log_path | '' | 日誌儲存路徑 | 留空則用 application/logs/。建議設為絕對路徑 /var/log/ci/ 便於 logrotate 管理。 |
log_file_permissions | 0644 | 日誌檔權限 | 生產環境設 0640,確保 Web 用戶可寫、日誌用戶可讀。 |
proxy_ips | '' | 信任代理 IP 列表 | 使用 CDN/負載平衡器時必填。逗號分隔。影響 $this->input->ip_address() 取得真實客戶 IP。 |
encryption_key | '' | 加密金鑰 | 生產環境必填 32 字元隨機字串。用於 Session 加密、Encrypt Library。洩漏將導致 Session 劫持、資料解密。 |
composer_autoload | FALSE | 載入 Composer autoload | 設為 TRUE 或 vendor/autoload.php 路徑。啟用後可直接使用 Composer 套件。 |
csrf_protection | FALSE | 啟用 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_expire | 7200 | CSRF Token 過期秒數 | 配合 Session 過期時間設定。 |
config_item() (唯讀)$charset = config_item('charset'); // 返回 'UTF-8'
$csrf = config_item('csrf_protection'); // 返回 TRUE/FALSE
// 讀取
$charset = $this->config->item('charset');
// 修改 (僅影響當前請求)
$this->config->set_item('csrf_protection', FALSE); // 關閉特定頁面 CSRF
$this->config->set_item('language', 'chinese'); // 動態切換語系
// 取得所有配置陣列
$all_config = $this->config->config; // 參考傳回,修改會影響全域
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);
}
}
}
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 開發者必修課。建立「配置即代碼」文化:敏感值環境變數化、環境差異目錄化、業務配置檔案化、動態修改局部化。