当前位置: 首页 > 图文教程 > 网络编程 > PHP > 回答PHPCHINA上的几个问题:URL映射

PHP
php面向对象全攻略 (十五) 多态的应用
php面向对象全攻略 (十六) 对象的串行化
php面向对象全攻略 (十七) 自动加载类
PHP parse_url 一个好用的函数
PHP 字符串分割和比较
全世界最小的php网页木马一枚 附PHP木马的防范方法
PHP 日期加减的类,很不错
PHP 日期时间函数的高级应用技巧
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Ha0k 0.3 PHP 网页木马修改版
PHP iconv 函数转gb2312的bug解决方法
关于页面优化和伪静态
使用zend studio for eclipse不能激活代码提示功能的解决办法
PHP 身份验证方面的函数
基于OpenCV的PHP图像人脸识别技术
用mysql触发器自动更新memcache的实现代码
php 数学运算验证码实现代码
PHP网站开发方案实例
PHP教程:挖掘细节提升网站性能
搜索引擎技术核心揭密(PHP)

回答PHPCHINA上的几个问题:URL映射


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 187 ::
收藏到网摘: n/a

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;
}
?>