回答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 相关文章推荐
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
PHP常用函数小技巧
Sep 11 PHP
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
php获取bing每日壁纸示例分享
Feb 25 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
Jun 25 PHP
标准版Eclipse搭建PHP环境的详细步骤
Nov 18 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 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桌面中心(二) 数据库写入
2007/03/11 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
Python用模块pytz来转换时区
2016/08/19 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
scrapy头部修改的方法详解
2020/12/06 Python
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
职专应届生求职信
2013/11/16 职场文书
应聘收银员个人的求职信
2013/11/30 职场文书
九年级化学教学反思
2014/01/28 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
高中政治教师教学反思
2016/02/23 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
基于Python编写一个监控CPU的应用系统
2022/06/25 Python