回答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+MySQL 制作简单的留言本
Nov 02 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
php获取系统变量方法小结
May 29 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
May 05 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
PHP isset()及empty()用法区别详解
Aug 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引用(&amp;)
2014/09/04 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
读jQuery之一(对象的组成)
2011/06/11 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
python中添加模块导入路径的方法
2021/02/03 Python
入党自我鉴定范文
2013/10/04 职场文书
医学专业大学生求职的自我评价
2013/11/27 职场文书
优秀的茶餐厅创业计划书
2014/01/03 职场文书
毕业大学生自荐信
2014/06/17 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
助学感谢信范文
2015/01/21 职场文书
防暑降温通知书
2015/04/27 职场文书
行为规范主题班会
2015/08/13 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript