[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~%.:_\+\-';就可以了。 原文地址http://bbiao.spaces.live.com/blog/cns!C201294984BAF810!1187.entry 我非常欣赏楼主的思路!不要修改 CI 的代码,而是去扩展他!
希望大家多学习楼主的思路!
赞!
太感谢的。。。
大感谢的。。很须要的好方法。 我看这帖子并试着改时发现现在的1.7版里支持中文地址了,URI.php中_filter_uri函数是这样写的:$bad = array('$', '(', ')', '%28', '%29');
$good = array('$', '(', ')', '(', ')');
return str_replace($bad, $good, $str);
所以可以说是不用再自己转义了,我很赞同楼主所说的:尽量不要去修改它,而是去扩展他。
对于一个框架来说是时刻在更新的,自己修改了就意味着在下次升级中会遇到很多问题。 好思想,学习~! 5# lwkyykk
我用的1.7,还是有这个问题。
神贴啊{:3_46:} 学习了。 感恩楼主!
让我的问题得到迅速的解决。
页:
[1]
2