bbiao 发表于 2008-7-22 18:19:36

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

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,其内容为:
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~%.:_\+\-';就可以了。

bbiao 发表于 2008-7-22 18:20:14

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

Hex 发表于 2008-7-23 12:10:41

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

ruhaole 发表于 2008-11-6 20:21:50

太感谢的。。。

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

lwkyykk 发表于 2008-11-13 22:37:17

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

所以可以说是不用再自己转义了,我很赞同楼主所说的:尽量不要去修改它,而是去扩展他。
对于一个框架来说是时刻在更新的,自己修改了就意味着在下次升级中会遇到很多问题。

chxizi 发表于 2009-8-8 18:34:37

好思想,学习~!

allankliu 发表于 2009-9-5 17:35:42

5# lwkyykk

我用的1.7,还是有这个问题。

kazaff 发表于 2009-9-10 09:17:22

神贴啊{:3_46:}

bingshao 发表于 2009-9-11 11:57:46

学习了。

htouch 发表于 2009-11-11 17:25:27

感恩楼主!
让我的问题得到迅速的解决。
页: [1] 2
查看完整版本: [1.6.0]CodeIgniter中URL含有中文字符串的解决方案