CodeIgniter 中国开发者社区诚征热爱 CI 的版主

查看完整版本: [1.6.0]CodeIgniter中URL含有中文字符串的解决方案

bbiao 2008-7-22 18:19

[1.6.0]CodeIgniter中URL含有中文字符串的解决方案

CodeIgniter默认的配置下是不允许URL中包含非ASCII字符的,如果我们有这样一个字符串:
[url=http://www.example.com/photo/]http://www.example.com/photo/[/url]北京/鸟巢.jpg
那么CI会毫不客气的告诉你:
The URI you submitted has disallowed characters.
你可能会说,那我把这个URL使用函数urlencode一下呢?不行。因为WebServer会在接收到一个被urlencode的URL后自动将其decode,然后在PHP里得到的这些字符串转换成他原来所代表的含义,并使用Web Server自己的URL编码字符集(IIS6 中文版是GBK,Apache2.2是UTF-8)传送给应用程序,这就使得CI得到的URL已经是一个解码过的,无论你有没有对URL进行urlencode,浏览器在发出请求时会自动检测,若没有,则会自动进行编码。所以,手动的进行urlencode并不能解决问题。那么我们应该怎么做来解决这个问题呢?
对于CI这种框架,用到现在,我的观点是尽量不要去修改它,而是去扩展他,CI提供了很好的扩展机制,我们只需要在application/libraries/下增加一个文件MY_URI.php,其内容为:
[code=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;
    }  
}[/code]
我覆盖了原来CI_URI中的_filter_uri方法,这样就可以使得中文的URL通过检测。但是,如果URL里有空格,也不行了,怎么办呢?原来,urlencode会将空格转换成+,而CI的默认配置中是不允许+出现在URL里的,OK,把$config['permitted_uri_chars'] = 'a-z0-9~%.:_\-';改成$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-';就可以了。

bbiao 2008-7-22 18:20

原文地址[url]http://bbiao.spaces.live.com/blog/cns!C201294984BAF810!1187.entry[/url]

Hex 2008-7-23 12:10

我非常欣赏楼主的思路!不要修改 CI 的代码,而是去扩展他!
希望大家多学习楼主的思路!
赞!

ruhaole 2008-11-6 20:21

太感谢的。。。

大感谢的。。很须要的好方法。

lwkyykk 2008-11-13 22:37

我看这帖子并试着改时发现现在的1.7版里支持中文地址了,URI.php中_filter_uri函数是这样写的:
                $bad        = array('$',                 '(',                 ')',                 '%28',                 '%29');
                $good        = array('$',        '(',        ')',        '(',        ')');
               
                return str_replace($bad, $good, $str);

所以可以说是不用再自己转义了,我很赞同楼主所说的:尽量不要去修改它,而是去扩展他。
对于一个框架来说是时刻在更新的,自己修改了就意味着在下次升级中会遇到很多问题。
页: [1]
查看完整版本: [1.6.0]CodeIgniter中URL含有中文字符串的解决方案