php快速url重写 更新版[需php 5.30以上]


Posted in PHP onApril 20, 2010

对于apache的rewrite模块打开和设置则非本文主题,请见其他文章详解.
这个类只能php 5.30以上的版本才能使用,继承了上一个版本的快速重定向的特点(单独类,全部使用静态调用),增添了一个很重要的功能和属性 可以调用其他url中的模块了 也使得模块与模块间或页面与页面间的函数简化共享得以实现
.htaccess文件写法:

#-------------- .htaccess start --------------- 
RewriteEngine on 
RewriteRule !\.(js|ico|gif|jpg|png|css|swf|htm|txt)$ index.php 
php_flag magic_quotes_gpc off 
php_flag register_globals off 
#-------------- .htaccess end ---------------

重写功能引入:让站点根目录的index.php末尾写上下列代码,重写就开启了(正常条件:1.apache的重写配置成功,且开启了.htaccess支持的.2.站点根目录的.htaccess文件设置好了.3.class.rewrite.php类文件在index.php前面部分加载了.4.页面模块文件位置及写法无误):
//............ 
Rewrite::__config( 
$config['path'],/*'http://xxxxx/mysite/'URL基础位置*/ 
$config['md_path'],/*'c:/phpsite/www/mysite/modules/'模块文件物理目录*/ 
array( 
'phpinfo' 
) 
); 
Rewrite::__parse(); 
//..........

模块文件写法:
testPk.php
<?php 
class Rw_testPk extends Rewrite { 
//这个是前导函数,只要访问到testpk这个页面,这个必然会执行,可用来控制本页面内函数访问权限或本页面全局变量 
public static function init(){ 
//if (!defined('SITE_PASS')){ 
echo self::$linktag.'<br/>';//self::$linktag是页面解析位置路径值,会常使用. 
//} 
} 
//当访问"http://localhost/testpk/"时会执行 
public static function index(){ 
echo 'test'; 
} 
//当访问"http://localhost/testpk/blank"时会执行或写作"http://localhost/testpk/index/blank"一般"index/"都是可以被省略的 
public static function blank(){} 
} 
?>

class.rewrite.php;
<?php 
class Rewrite{ 
public static $debug = false;//是否打开调试 
public static $time_pass = 0;//获得模块文件整体执行时间 
public static $version = 2.2; 
public static $pretag = 'Rw_';//模块文件类的名称前缀 
public static $linktag = 'index';//页面链接标记,用来标记解析的是那个链接,可用来控制各种菜单效果和链接访问权限 
protected static $time_start = 0; 
protected static $time_end = 0; 
protected static $physical_path = '';//模块文件的物理路径 
protected static $website_path = '';//模块文件的站点路径,因为可能把站点放大站点的子目录下,如:http://localhost/site/mysite 
protected static $ob_contents = ''; 
protected static $uid = 0;//配合个人主页访问方式 如http://localhost/423/则是访问http://localhost/profile?uid=423 
//允许的系统函数如$allow_sys_fun=array('phpinfo')那么系统将允许链接访问phpinfo内容了,当http://localhost/phpinfo或http://localhost/......./phpinfo时就会直接执行phpinfo这个函数,不需要phpinfo.php模块文件 
private static $allow_sys_fun = array(); 
private static function __get_microtime(){ 
list($usec, $sec) = explode(" ",microtime()); 
return ((float)$usec + (float)$sec); 
} 
//设置调试Rewrite::__debug(true); 
public static function __debug($d = true){ 
static::$debug = $d; 
} 
//配置路径和允许函数 
public static function __config($website_path = '',$physical_path = '',$allow_sys_fun = array()){ 
self::$physical_path = $physical_path; 
self::$website_path = $website_path; 
self::$allow_sys_fun = $allow_sys_fun; 
} 
//调试函数 
public static function __msg($str){ 
if(static::$debug){ 
echo "\n<pre>\n".print_r($str,true)."\n</pre>\n"; 
} 
} 
//解析开始时间 
public static function __start(){ 
self::$time_start = self::__get_microtime(); 
} 
//解析结束时间 
public static function __end($re = false){ 
self::$time_end = self::__get_microtime(); 
self::$time_pass = round((self::$time_end - self::$time_start),6) * 1000; 
if($re){ 
return self::$time_pass; 
}else{ 
self::__msg('PASS_TIME: '.self::$time_pass.' ms'); 
} 
} 
//内部跨模块url解析调用,如在test1.php模块页面中执行了Rwrite::__parseurl('/test2/show')这句,将调用test2.php模块页面中的show方法(Rw_test2这个class的方法) 
public static function __parseurl($url = '',$fun = '',$data = NULL){ 
if(!empty($url)&&!empty($fun)){ 
$p = static::$physical_path; 
if(file_exists($p.$url) || file_exists($p.$url.'.php') ){ 
$part = strtolower(basename( $p.$url , '.php' )); 
static::$linktag = $part.'/'.$fun; 
$fname = static::$pretag.$part; 
if(class_exists($fname, false)){ 
if(method_exists($fname,$fun)){ 
return $fname::$fun($data); 
} 
}else{ 
include( $p.$url ); 
if( class_exists($fname, false) && method_exists($fname,$fun)){ 
return $fname::$fun($data); 
} 
} 
} 
} 
} 
//核心链接解析函数Rwrite::__parse();在顶级重写核心定向目标index.php中的执行,意味着Rwrite自定义重写开启 
public static function __parse($Url = ''){ 
self::__start(); 
$p = static::$physical_path; 
$w = static::$website_path; 
$req_execute = false; 
$url_p = empty($Url) ? $_SERVER['REQUEST_URI'] : $Url; 
$local = parse_url($w); 
$req = parse_url($url_p); 
$req_path = preg_replace('|[^\w/.\\\]|','',$req['path']); 
$req_para = empty($Url) ? strstr($_SERVER['SERVER_NAME'],'.',true) : 'www'; 
if(empty($Url) && substr_count($_SERVER['SERVER_NAME'],'.') == 2 && $req_para != 'www'){ 
self::__goto($req_para,preg_replace('|^'.$local['path'].'|',"",$req_path)); 
return ; 
}else{ 
$req_path_arr = empty($req_path)?array():preg_split("|[/\\\]+|",preg_replace('|^'.$local['path'].'|',"",$req_path)); 
$req_fun = array_pop($req_path_arr); 
if(substr($req_fun,0,2)=='__'){ 
$req_fun = substr($req_fun,2); 
} 
$req_path_rearr = array_filter($req_path_arr); 
self::__msg($req_path_rearr); 
$req_temp = implode('/',$req_path_rearr); 
$fname = $req_temp.'/'.$req_fun; 
if(!empty($req_fun)&&in_array($req_fun,static::$allow_sys_fun)){ 
$req_fun(); 
}else{ 
if(!empty($req_fun)&&file_exists($p.$fname.'.php') ){ 
include( $p.$fname.'.php' ); 
}else{ 
$fname = empty($req_temp) ? 'index' : $req_temp; 
if(file_exists($p.$fname.'.php') ){ 
include( $p.$fname.'.php' ); 
}else{ 
$fname = $req_temp.'/index'; 
if(file_exists($p.$fname.'.php')){ 
include( $p.$fname.'.php' ); 
}else{ 
//这个地方是对"个人主页"的这种特殊链接定向到"profile/"了,可自己修改 
//如:www.xxx.com/12/将表示www.xxx.com/profile/?uid=12或www.xxx.com/profile?uid=12 
$uid = is_numeric($req_temp) ? $req_temp : strstr($req_temp, '/', true); 
$ufun = is_numeric($req_temp) ? 'index' : strstr($req_temp, '/'); 
if(is_numeric($uid)){ 
self::$uid = $uid; 
if(!isset($_GET['uid'])) $_GET['uid'] = $uid; 
$fname = 'profile/'.$ufun; 
if(file_exists($p.$fname.'.php')){ 
include( $p.$fname.'.php' ); 
}else{ 
header("location:".$w); 
exit(); 
} 
}else if(file_exists($p.'index.php')){ 
$fname = 'index'; 
include( $p.'index.php' ); 
}else{ 
header("location:".$w); 
exit(); 
} 
} 
} 
} 
$ev_fname = strrpos($fname,'/')===false ? $fname : substr($fname,strrpos($fname,'/')+1); 
$ev_fname = static::$pretag.$ev_fname; 
if( class_exists($ev_fname, false) && method_exists($ev_fname,$req_fun)){ 
static::$linktag = $req_fun=='index' ? $fname.'/' : $fname.'/'.$req_fun; 
if($req_fun != 'init' && method_exists($ev_fname,'init')){ 
$ev_fname::init(); 
} 
$ev_fname::$req_fun(); 
}else if( class_exists($ev_fname, false) && method_exists($ev_fname,'index') ){ 
static::$linktag = $fname.'/'; 
if(method_exists($ev_fname,'init')){ 
$ev_fname::init(); 
} 
$ev_fname::index(); 
}else if( $fname != 'index' && class_exists(static::$pretag.'index', false) && method_exists(static::$pretag.'index','index') ){ 
$ev_fname = static::$pretag.'index'; 
static::$linktag = 'index/'; 
if(method_exists($ev_fname,'init')){ 
$ev_fname::init(); 
} 
$ev_fname::index(); 
}else{ 
self::__msg('Function Not Exist!'); 
} 
} 
} 
self::__end(); 
} 
//这里是用户自定义链接的解析(用数据库存储的解析值) 如: xiaoming.baidu.com 
//数据库中 xiaoming这个标签指向一个人的博客 就会到了www.baidu.com/blog?uid=12或www.baidu.com/blog?uname=xiaoming(这个就看自己咋设计数据库了) 
public static function __goto($para = '',$path = ''){ 
$w = static::$website_path; 
if(empty($para)){ 
exit('未知链接,解析失败,不能访问'); 
} 
if(class_exists('Parseurl')){ 
$prs = Parseurl::selectone(array('tag','=',$para)); 
self::__msg($prs); 
if(!empty($prs)){ 
$parastr = $prs['tag']; 
$output = array(); 
$_GET[$prs['idtag']] = $prs['id']; 
parse_str($prs['parastr'], $output); 
$_GET = array_merge($_GET,$output); 
$path = $prs['type'].'/'.preg_replace('|^/'.$prs['type'].'|','',$path); 
self::__msg($path); 
header('location:'.$w.$path.'?'.http_build_query($_GET)); 
exit(); 
}else{ 
header("location:".$w); 
exit(); 
} 
}else{ 
header("location:".$w); 
exit(); 
} 
} 
} 
?>
PHP 相关文章推荐
PHP的面向对象编程
Oct 09 PHP
需要注意的几个PHP漏洞小结
Feb 05 PHP
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
使用php语句将数据库*.sql文件导入数据库
May 05 PHP
yii实现图片上传及缩略图生成的方法
Dec 04 PHP
PHP安全下载文件的方法
Apr 07 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP区块查询实现方法分析
May 12 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 PHP
一个PHP的String类代码
Apr 20 #PHP
使用PHP提取视频网站页面中的FLASH地址的代码
Apr 17 #PHP
来自phpguru得Php Cache类源码
Apr 15 #PHP
php cache类代码(php数据缓存类)
Apr 15 #PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 #PHP
php 格式化数字的时候注意数字的范围
Apr 13 #PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 #PHP
You might like
基于Zend的Captcha机制的应用
2013/05/02 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解在Python和IPython中使用Docker
2015/04/28 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
Python中装饰器学习总结
2018/02/10 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
Python交互式图形编程的实现
2019/07/25 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
如何理解委托
2012/01/06 面试题
电子商务求职信
2014/06/15 职场文书
报到证办理个人委托书
2014/10/06 职场文书
基层党组织整改方案
2014/10/25 职场文书
幸福来敲门观后感
2015/06/04 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
暑期家教宣传单
2015/07/14 职场文书
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis