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脚本的10个技巧(3)
Oct 09 PHP
php与paypal整合方法
Nov 28 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
培养自己的php编码规范
Sep 28 PHP
PHP的运行机制与原理(底层)
Nov 16 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
Mar 21 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 PHP
Laravel框架中集成MongoDB和使用详解
Oct 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
linux命令之调试工具strace的深入分析
2013/06/03 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
linux下php上传文件注意事项
2016/06/11 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
python中的装饰器详解
2015/04/13 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
python TCP包注入方式
2020/05/05 Python
python中Mako库实例用法
2020/12/31 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
广告学专业推荐信范文
2013/11/23 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
政协调研汇报材料
2014/08/15 职场文书
爬山的活动方案
2014/08/16 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
学前班语言教学计划
2015/01/20 职场文书
学术会议领导致辞
2015/07/29 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
Python基础之数据结构详解
2021/04/28 Python
python 实现的截屏工具
2021/05/08 Python
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers