from:http://www.afen.cn/blog/?p=129

codeIgniter默認的配置下是不允許URL中包含非ASCII字符的,如果我們有這樣一個字符串:
http://www.example.com/photo/北京/鳥巢.jpg
那么CI會毫不客氣的告訴你:
The URI you submitted has disallowed characters.
你 可能會說,那我把這個URL使用函數urlencode一下呢?不行。因為Web Server會在接收到一個被urlencode的URL后自動將其decode,然后在PHP里得到的這些字符串轉換成他原來所代表的含義,并使用 Web Server自己的URL編碼字符集(IIS6 中文版是GBK,Apache 2.2是UTF-8)傳送給應用程序,這就使得CI得到的URL已經是一個解碼過的,無論你有沒有對URL進行urlencode,瀏覽器在發出請求時會 自動檢測,若沒有,則會自動進行編碼。所以,手動的進行urlencode并不能解決問題。那么我們應該怎么做來解決這個問題呢?

對于CI這種框架,用到現在,我的觀點是盡量不要去修改它,而是去擴展他,CI提供了很好的擴展機制,我們只需要在application/libraries/下增加一個文件MY_URI.php,其內容為:

 

<?php 
class MY_URI extends CI_URI {
    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;
    }


}


?>

 

編碼解碼的兩行是我新加入的代碼,我覆蓋了原來CI_URI中的_filter_uri方法,這樣就可以使得中文的URL通過檢測。但是,如果URL里有空格, 也不行了,怎么辦呢?原來,urlencode會將空格轉換成+,而CI的默認配置中是不允許+出現在URL里的,OK,把$config ['permitted_uri_chars'] = ‘a-z 0-9~%.:_\-’;改成$config['permitted_uri_chars'] = ‘a-z 0-9~%.:_\+\-’;就可以了。