回答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的FTP学习(一)[转自奥索]
Oct 09 PHP
对盗链说再见...
Oct 09 PHP
php db类库进行数据库操作
Mar 19 PHP
php中获取指定IP的物理地址的代码(正则表达式)
Jun 23 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
php ajax数据传输和响应方法
Aug 21 PHP
PHP与以太坊交互详解
Aug 24 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 PHP
PHP常见的几种攻击方式实例小结
Apr 29 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实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
使用javascript访问XML数据的实例
2006/12/27 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
JS 表单验证大全
2011/11/23 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
js实现无缝滚动图
2017/02/22 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Python3 assert断言实现原理解析
2020/03/02 Python
PyTorch的torch.cat用法
2020/06/28 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
电信营业员自我评价分享
2014/01/17 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
第二课堂活动总结
2014/05/07 职场文书
老干部工作汇报材料
2014/10/28 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
教师节领导致辞
2015/07/29 职场文书
python区块链实现简版工作量证明
2022/05/25 Python