回答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 相关文章推荐
PHP4引用文件语句的对比
Oct 09 PHP
PHP新手上路(十四)
Oct 09 PHP
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
php代码检查代理ip的有效性
Aug 19 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
php获取数据库结果集方法(推荐)
Jun 01 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 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中操作Excel实例代码
2010/04/29 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
python中class的定义及使用教程
2019/09/18 Python
详解python tkinter 图片插入问题
2020/09/03 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
写给女朋友的道歉信
2014/01/08 职场文书
六一儿童节主持词
2014/03/21 职场文书
共产党员承诺书
2014/03/25 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书