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 相关文章推荐
PHP4 与 MySQL 交互使用
Oct 09 PHP
PHP简洁函数小结
Aug 12 PHP
php事务处理实例详解
Jul 11 PHP
php+mysqli批量查询多张表数据的方法
Jan 29 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
PHP解密Unicode及Escape加密字符串
May 17 PHP
WordPress开发中用于标题显示的相关函数使用解析
Jan 07 PHP
PHP匿名函数和use子句用法实例
Mar 16 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 PHP
Smarty环境配置与使用入门教程
May 11 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
php往mysql中批量插入数据实例教程
Dec 12 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
PHP的开合式多级菜单程序
2006/10/09 PHP
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
php时间函数用法分析
2016/05/28 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
查询json的数据结构的8种方式简介
2014/03/10 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
python生成指定尺寸缩略图的示例
2014/05/07 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
Python地图绘制实操详解
2019/03/04 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
简单叙述一下MYSQL的优化
2016/05/09 面试题
外贸采购员岗位职责
2014/03/08 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB