当前位置: 代码迷 >> PHP >> php url伪静态弥合析
  详细解决方案

php url伪静态弥合析

热度:49   发布时间:2016-04-28 23:17:29.0
php url伪静态化解析

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。

<?php/** *对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三种形式的处理 [email protected]:null [email protected]: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,那应该要该的不多。)

<?phpfunction 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;}?> 
  相关解决方案