回答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通过header实现文本文件下载的代码
Aug 08 PHP
JS 网站性能优化笔记
May 24 PHP
php 不使用js实现页面跳转
Feb 11 PHP
php格式化时间戳显示友好的时间实现思路及代码
Oct 23 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 PHP
Nginx+php配置文件及原理解析
Dec 09 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中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python中模块string.py详解
2017/03/12 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
化工工艺专业求职信
2013/09/22 职场文书
矫正人员思想汇报
2014/01/08 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
安全大检查实施方案
2014/02/22 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
python实现过滤敏感词
2021/05/08 Python
浅谈Redis的几个过期策略
2021/05/27 Redis
Golang 切片(Slice)实现增删改查
2022/04/22 Golang
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android