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 相关文章推荐
set_include_path在win和linux下的区别
Jan 10 PHP
PHP字符串 ==比较运算符的副作用
Oct 21 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
解析php如何将日志写进syslog
Jun 28 PHP
PHP中feof()函数实例测试
Aug 23 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
May 28 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 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
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
prototype 源码中文说明之 prototype.js
2006/09/22 Javascript
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
Python中的列表知识点汇总
2015/04/14 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
Python何时应该使用Lambda函数
2019/07/02 Python
django删除表重建的实现方法
2019/08/28 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
什么是.net
2015/08/03 面试题
业务总经理岗位职责
2014/02/03 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
霸王洗发水广告词
2014/03/14 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python