CodeIgniter 解决 URL 含中文字符串及乱码方案
CodeIgniter 默认配置拒绝 URL 中的非 ASCII 字符,且在不同 Web 服务器(如 IIS vs Apache)下对中文字符的编码解析不一致。通过扩展核心类和调整配置文件,可彻底解决 URL 中文过滤失败及参数乱码问题。
扩展 CI_URI 类允许中文 URL
在 CodeIgniter 中,直接修改框架核心文件并非最佳实践。建议通过扩展机制来增加对中文 URL 的支持。创建一个名为 MY_URI.php 的文件并放置于 application/core/ 目录下(注:早期版本可能位于 libraries/)。
第1步:创建自定义 URI 类
目的:覆盖默认的 URL 过滤逻辑,允许包含编码后的中文字符。
操作入口:新建文件 application/core/MY_URI.php
代码内容:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_URI extends CI_URI {
/**
* 自定义的url过滤函数
*/
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。
配置 Permitted URI Characters
由于 urlencode 会将空格转换为 +,而默认的白名单通常不包含该符号,需同步修改配置文件。
第2步:修改 config.php 白名单
目的:允许 URL 中出现编码后的特殊符号(如加号)或直接定义中文字符范围。
操作入口:application/config/config.php
动作:找到 $config['permitted_uri_chars'] 并修改。
方案 A:支持编码符号(推荐配合上述代码使用)
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-';
方案 B:直接指定中文字符 Unicode 范围
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-u4e00-u9fa5';
注意:如果使用方案 B,通常不需要复杂的 urlencode/urldecode 循环逻辑,但需确保服务器环境正确处理 UTF-8。若遇到以下乱码问题,请继续执行下一步。
解决 IIS 环境下的 URL 中文乱码
在本地 Apache 环境可能正常,但在 IIS(特别是中文版 Windows Server)环境下,$_SERVER['REQUEST_URI'] 获取到的中文部分可能已被编码为 GBK 或 GB2312,而在 UTF-8 项目中使用会导致乱码。
第3步:检测并转换编码
目的:在路由解析前,强制将请求 URI 转换为正确的 UTF-8 编码。
操作入口:application/core/MY_URI.php 的构造函数或相关解析逻辑中
动作:使用 iconv 函数进行转码。
// 假设 $uri 变量中存储了当前获取的中文字符串片段
// 从 GB2312/GBK 转换为 UTF-8
$uri = iconv('GB2312', 'UTF-8', $uri);
验证方法:在控制器中打印 $_SERVER['REQUEST_URI'] 或使用 URI 对象获取参数,确认中文显示正常而非乱码方块或问号。
总结
通过继承 CI_URI 并重写 _filter_uri,结合 config.php 中的白名单调整,可以突破 CodeIgniter 对非 ASCII 字符的限制。针对 IIS 等服务器的编码差异,务必在应用层增加编码转换逻辑。以上就是 CodeIgniter 完美解决 URL 含有中文字符串的详细内容,更多关于 CodeIgniter 路由配置的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









