回答PHPCHINA上的几个问题:URL映射


Posted in PHP onFebruary 14, 2007

PHPCHINA服务器搬迁后,我就基本上上不去了,只能用代理,郁闷。但用代理居然不能发帖,回帖。做为版主,深感遗憾,今天用代理上去看到了几个帖子,顺便在这里回答下。

   1、大家来说说URL映射吧
   一般url映射有两种方式,一种是通过mod_rewrite实现,这种网上教材很多我也不多说了。另外一种是在程序中模拟,比如类似zend Framework中的那种方式/index.php/controller/action/var1/value1/var2/value2/。这里方式其实最主要是通过一个统一的输入接口,然后对url进行解析,最后转发到相应的controller中的module。

    我这里写了两个简单函数来模拟。
    第一个函数主要是进行地址解析,把类似/index.php/controller/action/var1/value1/var2/value2/的地址解析出来,一般来说要解析成三部分:controller,module,params。 

<?   
/**   
  *对url路由进行简单的解析,支持对/path/to/site/index.php/module/action/parm/value   
  * /path/to/site/index.php?/module/action/parm/value和   
  * /path/to/site/?/module/action/parm/value三种形式的处理   
  *@param:null   
  *@return:router array   
  */   
function url_router(){   
   $path=strip_tags($_SERVER['REQUEST_URI']);   
   $strpos=strpos($path,'.php');   
   if($strpos){   
       $path=substr($path,$strpos+4);     
   }else{   
       if(empty($_SERVER['QUERY_STRING'])){   
           $strpos=strpos($path,'?');   
           if($strpos){   
              $path=substr($path,$strpos+1);   
           }else{   
              $path='';   
           }   
       }else{   
           $path=$_SERVER['QUERY_STRING'];   
       }   
   }   
   //统一化$path的格式,如果$path的第一个字符为/则去掉   
   if($path[0]=='/'){   
       $path=substr($path,1);   
   }   
   //解析,并且路由   
   if(!empty($path)){   
       $path=explode('/',$path);   
       $router['controller']=$path[0];   
       $router['action']=(!empty($path[1]))?$path[1]:'index';   
       //print_r($path);   
       for($i=2;$i<sizeof($path);$i=$i+2){   
           $params[$path[$i]]=(isset($path[$i+1]))?$path[$i+1]:'';   
       }   
       $router['params']=$params;   
   }else{   
       //默认路由信息   
       $router['controller']='index';   
       $router['action']='index';   
       $router['params']=array();   
   }   
   return $router;   
}   
?> 
 

    这里就完成主要的url解析功能,然后是转发映射,下面这个函数实现(注意这个函数的实现是结合了我自己的架构,所以你采用的话需要相应的修改,当然你的MVC如果类似zend Framework,那应该要该的不多。)

<?   
function url_dispatch($router,$app_path='/app/controllers/')   
{   
   require_once(SERVER_PATH.'/libs/controller.class.php');   
   $controller=$router['controller'].'Controller';   
   //echo SERVER_PATH.$app_path.$controller.'.class.php';   
   if(!file_exists(SERVER_PATH.$app_path.$controller.'.class.php'))die('缺少必要的类!');   
   require_once(SERVER_PATH.$app_path.$controller.'.class.php');   
   $controller=new $controller();   
   $controller->_setParam($router['params']);   
   $controller->{$router['action'].'Action'}();   
   return true;   
}   
?>  
PHP 相关文章推荐
如何隐藏你的.php文件
Jan 04 PHP
PHP register_shutdown_function函数的深入解析
Jun 03 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
PHP实现取得HTTP请求的原文
Aug 18 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
Yii实现Command任务处理的方法详解
Jul 14 PHP
详解Yii2.0 rules验证规则集合
Mar 21 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 PHP
简单采集了yahoo的一些数据
Feb 14 #PHP
自己前几天写的无限分类类
Feb 14 #PHP
用PHPdig打造属于你自己的Google[图文教程]
Feb 14 #PHP
php中的一个中文字符串截取函数
Feb 14 #PHP
PHP音乐采集(部分代码)
Feb 14 #PHP
一个数据采集类
Feb 14 #PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 #PHP
You might like
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
基于jquery的$.ajax async使用
2011/10/19 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
Python装饰器用法实例分析
2019/01/14 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
python 爬取小说并下载的示例
2020/12/07 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
银行员工辞职信范文
2014/01/20 职场文书
市场总经理岗位职责
2014/04/11 职场文书
财务人员入职担保书
2015/09/22 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
Python办公自动化解决world文件批量转换
2021/09/15 Python
python基础之类属性和实例属性
2021/10/24 Python