回答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中GET变量的使用
Oct 09 PHP
通用PHP动态生成静态HTML网页的代码
Mar 04 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 PHP
php_screw 1.5:php加密: 安装与使用详解
Jun 20 PHP
浅析PHP绘图技术
Jul 03 PHP
php addslashes 利用递归实现使用反斜线引用字符串
Aug 05 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 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 Mysql编程之高级技巧
2008/08/27 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
python实现画一颗树和一片森林
2018/06/25 Python
python频繁写入文件时提速的方法
2019/06/26 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
如何利用Python 进行边缘检测
2020/10/14 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
python如何写个俄罗斯方块
2020/11/06 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
SQL语言面试题
2013/08/27 面试题
会计助理的岗位职责
2013/11/29 职场文书
晚宴邀请函范文
2014/01/15 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
田径运动会广播稿
2015/08/19 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers