PHP quick url rewriting update (PHP 5.30 +)
- 2020-03-31 20:35:02
- OfStack
Opening and setting up the rewrite module of apache is not the subject of this article. See other articles for details.
This class can only use the PHP version 5.30 +, inherited the previous version of the characteristics of quick redirection (separate classes, all use static call), adds a very important function and attributes can call other module makes the module and the module of the url or between pages and pages of functions to simplify sharing be realized
. Htaccess
Rewrite function introduced: let the site root directory of index.php at the end of the following code, rewrite opened (normal conditions :1. Apache rewrite configuration successful, and opened the support of. Htaccess.
Module file writing:
TestPk. PHP
Class. Rewrite. PHP;
This class can only use the PHP version 5.30 +, inherited the previous version of the characteristics of quick redirection (separate classes, all use static call), adds a very important function and attributes can call other module makes the module and the module of the url or between pages and pages of functions to simplify sharing be realized
. 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 ---------------
Rewrite function introduced: let the site root directory of index.php at the end of the following code, rewrite opened (normal conditions :1. Apache rewrite configuration successful, and opened the support of. Htaccess.
//............
Rewrite::__config(
$config['path'],/*'http://xxxxx/mysite/'URL Basic location */
$config['md_path'],/*'c:/phpsite/www/mysite/modules/' Module file physical directory */
array(
'phpinfo'
)
);
Rewrite::__parse();
//..........
Module file writing:
TestPk. PHP
<?php
class Rw_testPk extends Rewrite {
//This is the leading function, which will be executed whenever you visit the testpk page, and can be used to control the access of functions within the page or the global variables of the page
public static function init(){
//if (!defined('SITE_PASS')){
echo self::$linktag.'<br/>';//Self ::$linktag is the path value of the page resolution position and is often used.
//}
}
//This is done when you access "HTTP: arbitration /testpk/"
public static function index(){
echo 'test';
}
//When accessing "HTTP: / __localhost testpk/blank" will perform or writing "HTTP: / __localhost testpk/index/blank" general "index/" can be omitted
public static function blank(){}
}
?>
Class. Rewrite. PHP;
<?php
class Rewrite{
public static $debug = false;//Whether to turn on debugging
public static $time_pass = 0;//Gets the overall execution time of the module file
public static $version = 2.2;
public static $pretag = 'Rw_';//The name prefix of the module file class
public static $linktag = 'index';//The page link tag, which is used to mark the resolution of the link, can be used to control various menu effects and link access rights
protected static $time_start = 0;
protected static $time_end = 0;
protected static $physical_path = '';//The physical path to the module file
protected static $website_path = '';//The site path of the module file, as it is possible to enlarge the site to a subdirectory of the site, such as: HTTP: s /site/mysite
protected static $ob_contents = '';
protected static $uid = 0;//With the individual home page access mode, such as HTTP: arbitration /423/, you can visit HTTP: arbitration /profile. Uid = 423
//Allow system functions such as $allow_sys_fun=array('phpinfo') then the system will allow links to access the phpinfo content when HTTP: s/s/s/s/s/s/s/s/s/s... The phpinfo function is executed directly when /phpinfo, without the phpinfo.php module file
private static $allow_sys_fun = array();
private static function __get_microtime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
//Set up debug Rewrite:: arbitration debug(true);
public static function __debug($d = true){
static::$debug = $d;
}
//Configure the path and allow functions
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;
}
//Debug function
public static function __msg($str){
if(static::$debug){
echo "n<pre>n".print_r($str,true)."n</pre>n";
}
}
//Parse start time
public static function __start(){
self::$time_start = self::__get_microtime();
}
//Parse end time
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');
}
}
//Internal cross-module url resolution calls, such as '/test2/show' with Rwrite:: arbitration on the test1.php module page, will call the show method on the test2.php module page (the method of 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:: s/s (); Execution in the top-level override core target index.php means that Rwrite custom override is turned on
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{
//This place is a special link to "profile/" of "personal homepage", which can be modified by yourself
//For example :www.xxx.com/12/ will mean www.xxx.com/profile/? Uid = 12 or 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();
}
//Here is the parsing of user-defined links (with the parse values stored in the database) such as xiaoming.baidu.com
//The xiaoming TAB in the database points to a person's blog and goes to www.baidu.com/blog? Uid = 12 or www.baidu.com/blog? Uname =xiaoming
public static function __goto($para = '',$path = ''){
$w = static::$website_path;
if(empty($para)){
exit(' Unknown links , Parse failure , Can not access ');
}
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();
}
}
}
?>