CodeIgniter中含波斯语URL报请求未找到(404)问题求助
看起来你遇到的是非ASCII字符(波斯语)URL的编码处理问题——服务器把波斯语字符解析成了乱码的ASCII串,导致无法匹配到正确的路由。我帮你整理了几个关键的解决步骤:
1. 调整.htaccess规则,保留UTF-8编码
在你的.htaccess文件中补充或修改规则,确保Apache服务器不会转义UTF-8字符:
Options -Indexes -MultiViews AddDefaultCharset UTF-8 RewriteEngine On # 禁止直接访问index.php外的文件 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 核心规则:NE标记确保URL保留原始UTF-8编码 RewriteRule ^(.*)$ /Saffron/index.php/$1 [L,QSA,NE]
这里的NE(No Escape)标记是关键,它告诉Apache不要对波斯语这类多字节UTF-8字符进行额外转义,让CodeIgniter能接收到完整、正确的路径参数。
2. 配置CodeIgniter允许波斯语URI字符
打开application/config/config.php,修改以下配置项:
// 全局字符集设置为UTF-8 $config['charset'] = 'UTF-8'; // 允许URI中包含波斯语字符(添加آ-ی范围) $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-آ-ی';
默认的permitted_uri_chars只允许英文字符,加入波斯语字符范围后,CodeIgniter就不会因为字符过滤而截断或拒绝你的URL路径了。
3. 验证控制器接收参数的正确性
确保你的Product控制器方法能正常接收波斯语参数,比如:
class Product extends CI_Controller { public function index($product_id, $slug) { // 这里直接输出$slug,应该显示正确的波斯语文本 echo $slug; } }
如果有自定义路由规则(在application/config/routes.php中),也要确保规则兼容波斯语字符,比如:
$route['Product/(:num)/(:any)'] = 'Product/index/$1/$2';
(:any)会匹配包括波斯语在内的任意字符(前提是你已经配置好permitted_uri_chars)。
4. 优化URL中的空格问题
你的示例URL里有空格:مهارت-های-آموزشی-در مطالعه,空格在URL中容易引发编码混乱。建议生成URL时把空格替换成连字符,改成مهارت-های-آموزشی-در-مطالعه,既符合URL规范,也能减少解析错误。
完成以上配置后,重新请求带波斯语的URL,应该就能正常匹配到控制器方法,不会再出现404错误了。如果还有问题,可以开启CodeIgniter的日志功能(config.php中设置$config['log_threshold'] = 2;),查看日志里记录的URI参数是否正确,进一步排查问题。
内容的提问来源于stack exchange,提问作者Mohammadreza Esmaeeli

