ホームページ  >  記事  >  バックエンド開発  >  PHP クイック URL 書き換え例_PHP チュートリアル

PHP クイック URL 書き換え例_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:17:25975ブラウズ

バージョン 5.30 以降のみが使用できます。以前のバージョンの高速リダイレクトの特性 (別のクラス、すべて静的呼び出しを使用) を継承し、他の URL のモジュールを呼び出すことができる非常に重要な関数と属性も追加されています。モジュールを作成します モジュール間またはページ間での機能の共有の簡素化が実現できます

.htaccessファイルの書き込み方法:
コードは次のとおりです:
#------------- .htaccess 開始 ----------
リライトエンジンオン
RewriteRule !.(js|ico|gif|jpg|png|css|swf|htm|txt)$index.php
php_flag magic_quotes_gpc オフ
php_flag register_globals オフ
#--------------- .htaccess 終了 ---------------

書き換え機能の導入: サイトのルートディレクトリにあるindex.phpの末尾に以下のコードを記述すると書き換えが有効になります(通常の状態: 1. Apacheの書き換え設定が成功し、.htaccessのサポートが有効になります。 2. サイトroot ディレクトリの .htaccess ファイルが設定されます。 3.index.php の前部分に class.rewrite.php クラス ファイルがロードされます。 4. ページ モジュール ファイルの場所と記述方法は正しいです):
コードは次のとおりです:
//......
書き換え::__config(
$config['path'],/*'http://xxxxx/mysite/'URL ベースの場所*/
$config['md_path'],/*'c:/phpsite/www/mysite/modules/'モジュールファイルの物理ディレクトリ*/
配列(
「phpinfo」
)
);
リライト::__parse();
//.....

モジュールファイルの書き込み方法:
testPk.php
コードは次のとおりです:
class Rw_testPk extends Rewrite {
//これは先頭の関数です。testpk ページにアクセスしている限り、これはこのページ内の関数のアクセス許可を制御するために、またはこのページのグローバル変数を制御するために使用できます。 パブリック静的関数 init(){
//if (!define('SITE_PASS')){
echo self::$linktag.'
';//self::$linktag は、ページ解析の場所のパス値であり、よく使用されます。
//}
}
//「http://www.45it.net/testpk/」にアクセスすると実行されます
パブリック静的関数index(){
エコー「テスト」;
}
//「http://www.45it.net/testpk/blank」にアクセスすると、「http://www.45it.net/testpk/index/blank」として実行または記述されます。通常は「index/」となります。 「省略可
」 パブリック静的関数blank(){}
}
?>

class.rewrite.php;
コードは次のとおりです:
クラスリライト{
public static $debug = false;//デバッグをオンにするかどうか
public static $time_pass = 0;//モジュールファイルの全体的な実行時間を取得します
パブリック静的 $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://www.45it.net/site/mysite
のように、サイトのサブディレクトリに拡大される可能性があるためです。 protected static $ob_contents = '';
protected static $uid = 0;//http://www.45it.net/423/などの個人ホームページのアクセス方法に従って、http://www.45it.net/profile?uid=423にアクセスします
// $allow_sys_fun=array('phpinfo') などのシステム関数を許可すると、http://www.45it.net/phpinfo または http://www.45it.net/ の場合、システムはリンクから phpinfo コンテンツへのアクセスを許可します。 . ....../phpinfo は、phpinfo.php モジュール ファイルを使用せずに、phpinfo 関数を直接実行します
プライベート静的 $allow_sys_fun = array();
プライベート静的関数 __get_microtime(){
list($usec, $sec) =explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
//デバッグを設定 Rewrite::__debug(true);
パブリック静的関数 __debug($d = true){
static::$debug = $d;
}
//パスと許可される関数を設定します
パブリック静的関数 __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;
}
//デバッグ関数
パブリック静的関数 __msg($str){
if(static::$debug){
echo "n

n".print_r($str,true)."n
n";
}
}
//解析開始時間
パブリック静的関数 __start(){
self::$time_start = self::__get_microtime();
}
//終了時刻を解析します
パブリック静的関数 __end($re = false){
self::$time_end = self::__get_microtime();
self::$time_pass =round((self::$time_end - self::$time_start),6) * 1000;
if($re){
自分自身を返す::$time_pass;
}その他{
self::__msg('PASS_TIME: '.self::$time_pass.' ms');
}
}
//内部クロスモジュール URL 解析呼び出し。たとえば、Rwrite::__parseurl('/test2/show') が test1.php モジュール ページで実行される場合、(Rw_test2 の) test2.php モジュール ページの show メソッドが実行されます。クラス) が呼び出されます)
パブリック静的関数 __parseurl($url = '',$fun = '',$data = NULL){
if(!empty($url)&&!empty($fun)){
$p = 静的::$physical_path;
if(file_exists($p.$url) || file_exists($p.$url.'.php') ){
$part = strto lower(basename( $p.$url , '.php' ));
static::$linktag = $part.'/'.$fun;
$fname = static::$pretag.$part;
if(class_exists($fname, false)){
if(method_exists($fname,$fun)){
$fname::$fun($data) を返します;
}
}その他{
include( $p.$url );
if( class_exists($fname, false) && Method_exists($fname,$fun)){
$fname::$fun($data) を返します;
}
}
}
}
}
// コア リンク解析関数 Rwrite::__parse(); は、トップレベルの書き換えコアの方向性ターゲット Index.php で実行されます。これは、Rwrite カスタム書き換えが有効であることを意味します
パブリック静的関数 __parse($Url = ''){
self::__start();
$p = 静的::$physical_path;
$w = 静的::$website_path;
$req_execute = false;
$url_p = 空($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));
戻ります;
}その他{
$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();
}その他{
if(!empty($req_fun)&&file_exists($p.$fname.'.php') ){
include( $p.$fname.'.php' );
}その他{
$fname = 空($req_temp) 'インデックス' : $req_temp;
if(file_exists($p.$fname.'.php') ){
include( $p.$fname.'.php' );
}その他{
$fname = $req_temp.'/index';
if(file_exists($p.$fname.'.php')){
include( $p.$fname.'.php' );
}その他{
//この場所は「個人のホームページ」への特別なリンクを「プロフィール/」に誘導します。自分で変更できます
//例: 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) ? 'インデックス' : strstr($req_temp, '/');
if(is_numeric($uid)){
self::$uid = $uid;
if(!isset($_GET['uid'])) $_GET['uid'] = $uid;
$fname = 'プロフィール/'.$ufun;
if(file_exists($p.$fname.'.php')){
include( $p.$fname.'.php' );
}その他{
header("場所:".$w);
exit();
}
}else if(file_exists($p.'index.php')){
$fname = 'インデックス';
include( $p.'index.php' );
}その他{
header("場所:".$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();
}その他{
self::__msg('関数が存在しません!');
}
}
}
self::__end();
}
//ここでは、xiaoming.baidu.com などのユーザー定義リンクの分析 (データベースに保存されている分析値を使用) を示します
//データベース内の xiaoming タグは人のブログを指しており、www.baidu.com/blog?uid=12 または www.baidu.com/blog?uname=xiaoming に移動します (これは、データベース)
パブリック静的関数 __goto($para = '',$path = ''){
$w = 静的::$website_path;
if(空($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();
}その他{
header("場所:".$w);
exit();
}
}その他{
header("場所:".$w);
exit();
}
}
}
?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/372021.html技術記事バージョン 5.30 以降でのみ使用できます。以前のバージョンの高速リダイレクトの特性 (個別のクラス、すべて静的呼び出しを使用) を継承し、他の...
を呼び出すことができる非常に重要な関数と属性を追加します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。