用户
 找回密码
 入住 CI 中国社区
搜索
查看: 14963|回复: 17
收起左侧

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

[复制链接]
发表于 2008-7-22 18:19:36 | 显示全部楼层 |阅读模式
CodeIgniter默认的配置下是不允许URL中包含非ASCII字符的,如果我们有这样一个字符串:
http://www.example.com/photo/北京/鸟巢.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,其内容为:
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-z0-9~%.:_\-';改成$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-';就可以了。

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

 楼主| 发表于 2008-7-22 18:20:14 | 显示全部楼层
发表于 2008-7-23 12:10:41 | 显示全部楼层
我非常欣赏楼主的思路!不要修改 CI 的代码,而是去扩展他!
希望大家多学习楼主的思路!
赞!
发表于 2008-11-6 20:21:50 | 显示全部楼层

太感谢的。。。

大感谢的。。很须要的好方法。
发表于 2008-11-13 22:37:17 | 显示全部楼层
我看这帖子并试着改时发现现在的1.7版里支持中文地址了,URI.php中_filter_uri函数是这样写的:
                $bad        = array('$',                 '(',                 ')',                 '%28',                 '%29');
                $good        = array('$',        '(',        ')',        '(',        ')');
               
                return str_replace($bad, $good, $str);

所以可以说是不用再自己转义了,我很赞同楼主所说的:尽量不要去修改它,而是去扩展他。
对于一个框架来说是时刻在更新的,自己修改了就意味着在下次升级中会遇到很多问题。
发表于 2009-8-8 18:34:37 | 显示全部楼层
好思想,学习~!
发表于 2009-9-5 17:35:42 | 显示全部楼层
5# lwkyykk

我用的1.7,还是有这个问题。
发表于 2009-9-10 09:17:22 | 显示全部楼层
神贴啊
发表于 2009-9-11 11:57:46 | 显示全部楼层
学习了。
发表于 2009-11-11 17:25:27 | 显示全部楼层
感恩楼主!
让我的问题得到迅速的解决。

本版积分规则