CodeIgniter 完美解决URL含有中文字符串


Posted in PHP onMay 13, 2016

codeIgniter默认的配置下是不允许URL中包含非ASCII字符的,如果URL中含非ASCII字符,那么CI会毫不客气的抛出错误。本文章向码农介绍CodeIgniter 如何解决URL含有中文字符串。

你 可能会说,那我把这个URL使用函数urlencode一下呢?不行。因为Web Server会在接收到一个被urlencode的URL后自动将其decode,然后在PHP里得到的这些字符串转换成他原来所代表的含义,并使用 Web Server自己的URL编码字符集(IIS6 中文版是GBK,Apache 2.2是UTF-8)传送给应用程序,这就使得CI得到的URL已经是一个解码过的,无论你有没有对URL进行urlencode,浏览器在发出请求时会 自动检测,若没有,则会自动进行编码。所以,手动的进行urlencode并不能解决问题。那么我们应该怎么做来解决这个问题呢?

对于CI这种框架,用到现在,我的观点是尽量不要去修改它,而是去扩展他,CI提供了很好的扩展机制,我们只需要在application/core/下(2.0版本以前的为application/libraries/)增加一个文件MY_URI.php,其内容为:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
 
class MY_URI extends CI_URI { 
 
 /** 
  * 自定义的url过滤函数 
  * 
  * @access private 
  * @param string 
  * @return string 
  */ 
 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-z 0-9~%.:_\-';

改成

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-';

就可以了。

或者

第一步把config.php 中的

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';

 

替换成

$config['permitted_uri_chars'] ='a-z 0-9~%.:_-u4e00-u9fa5';

面所有的操作我们都做完了,但是接下来你可能又遇到了新的问题,那就是url中得到的中文信息是乱码,不知道在你的服务器上会不会遇到该问题,但是我遇到了(IIS)。但是在本地是正常的,本地用的是apache。

好,我在程序中,把$_SERVER['REQUEST_URI']打印出来,发现它就是乱码的,苦思冥想,这是怎么回事?这就说明在我得到uri中的参数之前,就已经被编码了,好,我们使用iconv解码:

iconv("gb2312","UTF-8",$uri);

现在打印出来看看,好了,原来的中文参数打印出来了,是正确的。

这个问题解决了,但是还是有一个疑问,url为什么是gb2312编码的呢,如果在我的程序中使用(我采用的是utf-8编码),还需要转换为utf-8编码,是不是和web服务器是有关系的呢,希望大家能够帮忙解答。

以上这篇CodeIgniter 完美解决URL含有中文字符串就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
据说是雅虎的一份PHP面试题附答案
Jan 07 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
一个PHP的QRcode类与大家分享
Nov 13 PHP
有关PHP中MVC的开发经验分享
May 17 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
php文件包含目录配置open_basedir的使用与性能详解
Apr 03 PHP
laravel5.4生成验证码的实例讲解
Aug 05 PHP
PHP中非常有用却鲜有人知的函数集锦
Aug 17 PHP
php htmlentities()函数的定义和用法
May 13 #PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 #PHP
php调用自己java程序的方法详解
May 13 #PHP
Linux php 中文乱码的快速解决方法
May 13 #PHP
PHP 返回13位时间戳的实现代码
May 13 #PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 #PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 #PHP
You might like
Wordpress php 分页代码
2009/10/21 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
Symfony核心类概述
2016/03/17 PHP
Document 对象的常用方法
2009/07/31 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
python解析xml文件实例分享
2013/12/04 Python
python rsa 加密解密
2017/03/20 Python
python实现发送邮件功能代码
2017/12/14 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
行政总监岗位职责
2013/12/05 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书