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


Posted in PHP onApril 25, 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 获取全局变量的代码
Apr 21 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
jQuery 源码分析笔记
May 25 PHP
整理的一些实用WordPress后台MySQL操作命令
Jan 07 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
php实现高效获取图片尺寸的方法
Dec 12 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 PHP
PHP 中常量的知识整理
Apr 14 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 PHP
PHP CURL模拟GET及POST函数代码
Apr 25 #PHP
php file_get_contents函数轻松采集html数据
Apr 22 #PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 #PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 #PHP
php allow_url_include的应用和解释
Apr 22 #PHP
php strcmp使用说明
Apr 22 #PHP
PHP 加密解密内部算法
Apr 22 #PHP
You might like
php addslashes和mysql_real_escape_string
2010/01/24 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
理解Javascript闭包
2013/11/01 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
Flask框架WTForm表单用法示例
2018/07/20 Python
python调用java的jar包方法
2018/12/15 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
python实现智能语音天气预报
2019/12/02 Python
python可以用哪些数据库
2020/06/22 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
项目管理计划书
2014/01/09 职场文书
上级检查欢迎词
2014/01/18 职场文书
高中生的自我评价
2014/03/04 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
反对邪教标语
2014/06/30 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
七年级英语教学反思
2016/02/15 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS