from : http://codeigniter.org.cn/forums/thread-1224-1-1.html

參考URL:http://codeigniter.com/forums/viewthread/54019/

之前想要做一個搜索的東西,需要把關鍵詞放到URL上面,對用戶更加的友好,而且我感覺這樣也容易做分頁,避免不斷的post和用會話保存關鍵詞。
比如下面的路徑:
       http://www.example.com/search/name/我是中文
       但是一直報錯:Disallowed Key Characters.
       之前一直以為是system/library/URI.php的問題。不斷的去修改系統的$config['permitted_uri_chars'] = 'a-z A-Z 0-9~%.:_\-';和URI.php里面的_filter_uri($str)函數。也參照了之前幾位仁兄的經驗,結果還是沒有成功。
       無奈之下,搜索這句報錯信息的來源。結果發現是在system/library/URI.php里面的_clean_input_keys($str)這個函數。因為中文的編碼在這個地方沒有通過正則表達式的匹配,只能被無情的掛掉。
       現在看來,CI過濾URI中的字符有兩道防線,第一道防線,是Input.php類里面的_clean_input_keys($str)函數,通過正則匹配,及時卡掉非法字符,第二道防線是URI.php里面的_filter_uri($str),通過系統設定的$config['permitted_uri_chars']來進行正則的匹配。卡掉非法的字符。但是我又感到了CI框架的一個缺陷。就是Input.php和URI.php里面的過濾函數各為其主,采用不同的正則表達式進行匹配,URI.php里面采用的是正統的$config['permitted_uri_chars'],Input.php采用的是固定的”/^[a-z0-9:_\/-]+$/i“。這樣,即便在$config['permitted_uri_chars']里面設置了中文的匹配條件,也會在Input.php層被卡掉。
       我的解決方法是:擴展Input類。
PHP
function _clean_input_keys($str)
    {
         if ( ! preg_match("/^[a-z0-9:_/-]+$/i", $str))
         {
             exit('Disallowed Key Characters.');
         }
        return $str;
    }
復制代碼
修改成
PHP
function _clean_input_keys($str)
    {
         $config = &get_config('config');
        if ( ! preg_match("/^[".$config['permitted_uri_chars']."]+$/i", rawurlencode($str)))
        {
            exit('Disallowed Key Characters.');
        }
        return $str;
    }
復制代碼
這樣就能夠在URI傳送中文了。我的CI版本是1.6.3