url_rewrite函数的实现基本思路是:
获得URL的参数部分($_SERVER['PATH_INFO']) =》对参数进行处理 =》构造原始参数字符串 =》赋值给$_SERVER['QUERY_STRING']及$_SERVER['REQUEST_URI']。
以下是程序代码,都有注释,很容易看懂。
- /**
- +------------------------------------------------------------------------------
- * url重写实现函数 function.php
- +------------------------------------------------------------------------------
- * date: 2008-11-29
- * author: zbl
- +------------------------------------------------------------------------------
- **/
- function url_rewrite(){
- if (isset( $_SERVER['PATH_INFO'])){
- $url = substr($_SERVER['PATH_INFO'] , 1); //url提交的参数部分,去掉'/'
- $url = explode(':', $url ); //以':'分割存放在数组中$url中
- foreach ($url as $key => $value){
- if ($key == 0){ //判断参数名
- if ($value != '') {
- $_GET ['module'] = $url[$key]; //将值存入$_GET数组中
- }
- $querystring[] = 'module='.$url[$key]; //组合参数名及值
- } else {
- if ($value != '') {
- $_GET['action'] = $url[$key];
- }
- $querystring[] = 'action='.$url[$key];
- }
- }
- $_SERVER['QUERY_STRING'] = implode("&", $querystring); //将组合后的字符串存入预定义变量$_SERVER['QUERY_STRING']中
- $_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']; //将完整的url地址存入预定义变量$_SERVER['REQUEST_URI']中
- }
- }
- /**
- +------------------------------------------------------------------------------
- * 类文件module.php
- +------------------------------------------------------------------------------
- * date: 2008-11-29
- * author: zbl
- +------------------------------------------------------------------------------
- **/
- class module{
- function index() {
- echo "This is index page";
- }
- function action() {
- echo "This is action page";
- }
- }
- /**
- +------------------------------------------------------------------------------
- * 入口文件index.php
- +------------------------------------------------------------------------------
- * date: 2008-11-29
- * author: zbl
- +------------------------------------------------------------------------------
- **/
- set_include_path(get_include_path().PATH_SEPARATOR.'common'.PATH_SEPARATOR.'lib'); //设定php.ini中的include_path路径
- include_once('function.php');
- include_once('module.php');
- url_rewrite(); //启动url rewrite
- $module = $_GET['module'];
- $action = $_GET['action'];
- if (class_exists($module) && method_exists($module, $action)) { //检查类及方法是否存在
- call_user_func(array($module, $action)); //调用相应的类及方法进行处理
- } else {
- call_user_func(array('module', 'index')); //当传入参数不正确的时候自动调用默认方法
- }
实现了基本的dispath,根据不同需求可在此基础上扩充。