回答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桌面中心(四) 数据显示
Mar 11 PHP
paypal即时到账php实现代码
Nov 28 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
深入解析phpCB批量转换的代码示例
Jun 27 PHP
PHP图片上传代码
Nov 04 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
php实现通过ftp上传文件
Jun 19 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
一个非常实用的php文件上传类
Jul 04 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
详解PHP设计模式之依赖注入模式
May 25 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
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
PHP反向代理类代码
2014/08/15 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
javascript验证身份证号
2015/03/03 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
js new Date()实例测试
2019/10/31 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
python3中bytes和string之间的互相转换
2017/02/09 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
python requests post多层字典的方法
2018/12/27 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
如何基于Python批量下载音乐
2019/11/11 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
python 获取字典键值对的实现
2020/11/12 Python
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
应届生船舶驾驶求职信
2013/10/19 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
英语读书笔记
2015/07/02 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技