CodeIgniter 解决 URL 含中文字符串及乱码方案

今天早睡
今天早睡
发布时间:2026-10-13 | 3人浏览过
原创

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 路由配置的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表