CodeIgniter 默認配置僅允許 URL 包含 ASCII 字符。當 URL 出現中文等非 ASCII 字符時,CI 會直接拋出 The URI you submitted has disallowed characters. 錯誤。許多開發者嘗試用 urlencode() 處理,但 Web Server(Apache/IIS)會自動解碼並按自身編碼(IIS 為 GBK,Apache 為 UTF-8)傳遞給 PHP,導致手動編碼無效。
利用 CodeIgniter 的核心類擴展機制,不修改框架核心文件。在 application/core/ 目錄(CI 2.0 以前為 application/libraries/)創建 MY_URI.php:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class MY_URI extends CI_URI {
/**
* 重寫 URI 過濾方法,支持中文字符
*/
protected function _filter_uri($str) {
if ($str !== '' AND $this->config->item('permitted_uri_chars') !== '') {
// 先編碼再匹配,允許中文通過正則檢查
$str = urlencode($str);
if (!preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str)) {
exit('The URI you submitted has disallowed characters.');
}
// 解碼還原為原始字符供後續路由使用
$str = urldecode($str);
}
return $str;
}
}
修改 application/config/config.php 中的 permitted_uri_chars,添加 + 號(urlencode 將空格轉為 +)及中文 Unicode 範圍:
// 原配置 $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; // 修改方案一:添加 + 號 $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-'; // 修改方案二:直接允許中文 Unicode 範圍(推薦) $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\u4e00-\u9fa5';
注意: 正則中的 \u4e00-\u9fa5 需在 PHP 字符串中正確轉義,實際配置建議使用原生字符或十六進制表示。
在 IIS 上運行時,$_SERVER['REQUEST_URI'] 獲取的中文可能為 GB2312 編碼,需手動轉換:
$uri = $_SERVER['REQUEST_URI'];
$uri = iconv('GB2312', 'UTF-8', $uri); // 轉為項目統一的 UTF-8 編碼
此問題源於 IIS 默認使用 GBK 編碼處理 URL,而 Apache 使用 UTF-8。建議統一服務器環境或在入口文件統一處理編碼轉換。
MY_URI.php 並放入正確目錄。config.php 許可字符集。index.php 入口處添加編碼統一代碼。https://example.com/控制器/方法/中文參數。system/core/URI.php,升級框架時會丟失修改。fastcgi_param REQUEST_URI 傳遞正確。$route 中正則需匹配解碼後的字符。