回答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 相关文章推荐
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
Oct 24 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
php的慢速日志引起的Mysql错误问题分析
May 13 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
PHP微信红包生成代码分享
Oct 06 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
phpmyadmin下载、安装、配置教程
May 16 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
jquery $.each()使用探讨
2013/09/23 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python后端接收前端回传的文件方法
2019/01/02 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
Python 字典中的所有方法及用法
2020/06/10 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
单位介绍信格式范文
2015/05/04 职场文书
SQL中的三种去重方法小结
2021/11/01 SQL Server
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js