ホームページ >バックエンド開発 >PHPチュートリアル >PHP 高速 URL 書き換えサンプル コード

PHP 高速 URL 書き換えサンプル コード

WBOY
WBOYオリジナル
2016-07-25 09:12:201160ブラウズ

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

  1. #------------- .htaccess start ---------------
  2. RewriteEngine on
  3. RewriteRule !.(js|ico | gif|jpg|png|css|swf|htm|txt)$index.php
  4. php_flagmagic_quotes_gpc off
  5. php_flag register_globals off
  6. #------------- .htaccess end ---- -- --------
コードをコピー

書き換え機能の導入:サイトのルートディレクトリにあるindex.phpの最後に以下のコードを書くと書き換えが可能になります(通常の状態) : 1. Apache の書き換え構成が成功し、.htaccess サポートが有効になります。 2. サイトのルート ディレクトリに .htaccess ファイルが設定されます。 3. class.rewrite.php クラス ファイルがインデックスの先頭部分にロードされます。 php. 4. ページ モジュール ファイルの場所と記述は正しいです): コードは以下のように表示されます。

  1. //......
  2. Rewrite::__config(
  3. $config['path'],/*'http://xxxxx/mysite/'URL ベースの場所 */
  4. $config[ 'md_path'],/*'c:/phpsite/www/mysite/modules/'モジュールファイルの物理ディレクトリ*/
  5. array(
  6. 'phpinfo'
  7. )
  8. );
  9. Rewrite::__parse( );
  10. //。 ......
コードをコピー

モジュールファイルの書き込み方法: testPk.php

  1. class Rw_testPk extends Rewrite {
  2. //これは、testpk ページにアクセスしている限り、確実に実行されます。このページまたはこのページのグローバル変数self::$linktag はページを解析する場所のパス値であり、頻繁に使用されます。
  3. //}
  4. }
  5. //「http://bbs.it-home.org/testpk/」にアクセスするときに実行されます
  6. public static functionindex(){
  7. echo 'test' ;
  8. }
  9. //「http://bbs.it-home.org/testpk/blank」にアクセスすると、「http://bbs.it」が実行または書き込みされます-home.org/testpk/index/blank" 通常は "index/" は省略可能
  10. public static functionblank(){}
  11. }
  12. ?>
  13. コードをコピー

class.rewrite.php; コードは以下のように表示されます:

  1. class Rewrite{
  2. public static $debug = false;//デバッグをオンにするかどうか
  3. public static $time_pass = 0;//モジュールファイルの全体の実行時間を取得する
  4. public static $version = 2.2;
  5. public static $pretag = 'Rw_'; //モジュールファイルクラスの名前プレフィックス
  6. public static $linktag = 'index'; //どのリンクが解析されるかをマークするために使用されます。さまざまなメニュー効果とリンクのアクセス権を制御するために使用されます
  7. protected static $time_start = 0;
  8. protected static $time_end = 0;
  9. protected static $physical_path = '';//モジュール ファイルの物理パス
  10. protected static $website_path = '';//モジュール ファイルの物理パス サイト パス。http://bbs.it-home.org/site/mysite
  11. protected static $ のように、サイトのサブディレクトリまでサイトを拡大できるため。 ob_contents = '';
  12. protected static $uid = 0;// http://bbs.it-home.org/423/ などの個人ホームページにアクセスするには、http://bbs.it-home.org/ にアクセスします。 profile?uid=423
  13. //$allow_sys_fun =array('phpinfo') などのシステム関数が許可されている場合、システムは http://bbs.it-home.org/phpinfo またはhttp://bbs.it-home.org/.... ./phpinfo は、phpinfo.php モジュール ファイルを必要とせずに、phpinfo 関数を直接実行します
  14. private static $allow_sys_fun = array();
  15. private static function __get_microtime(){
  16. list($usec, $sec) =explode(" ",microtime());
  17. return ((float)$usec + (float)$sec);
  18. }
  19. //デバッグの設定 書き換え: :__debug(true);
  20. public static function __debug($d = true){
  21. static::$debug = $d;
  22. }
  23. //設定パスと許可関数
  24. public static function __config($website_path = '', $physical_path = '',$allow_sys_fun = array()){
  25. self:: $physical_path = $physical_path;
  26. self::$website_path = $website_path;
  27. self::$allow_sys_fun = $allow_sys_fun;
  28. }
  29. //デバッグfunction
  30. public static function __msg($str){
  31. if(static::$ debug){
  32. echo "n
    n".print_r($str,true)."n
    n";
  33. }
  34. }
  35. //解析開始時刻
  36. public static function __start(){
  37. self ::$time_start = self::__get_microtime();
  38. }
  39. //解析終了時刻
  40. public static function __end($re = false){
  41. self::$time_end = self::__get_microtime();
  42. self:: $time_pass =round((self::$time_end - self::$time_start),6) * 1000;
  43. if($re){
  44. return self::$time_pass;
  45. }else{
  46. self::__msg(' PASS_TIME: '.self::$time_pass.' ms');
  47. }
  48. }
  49. //内部クロスモジュール URL 解析呼び出し (例: executing Rwrite::__parseurl('/test2/show' in the test1.php module page ) この文は、test2.php モジュール ページ (Rw_test2 クラスのメソッド) の show メソッドを呼び出します
  50. public static function __parseurl($url = '',$fun = '',$data = NULL){
  51. if(! empty($url)&&!empty($fun)){
  52. $p = static::$physical_path;
  53. if(file_exists($ p.$url) || file_exists($p.$url.'.php') ){
  54. $part = strto lower(basename( $p.$url , '.php' ));
  55. static::$linktag = $part.'/'.$fun;
  56. $fname = static::$pretag.$part;
  57. if(class_exists($fname, false)){
  58. if(method_exists($fname,$fun)){
  59. return $fname::$fun($data);
  60. }
  61. }else{
  62. include( $p.$url );
  63. if( class_exists($fname, false) && Method_exists($fname,$fun)){
  64. return $fname::$fun($data);
  65. }
  66. }
  67. }
  68. }
  69. }
  70. //コアリンク解析関数 Rwrite::__parse() は、トップレベルの書き換えコア方向ターゲットの Index.php で実行されます。これは、Rwrite カスタム書き換えがオンになっていることを意味します
  71. public static function __parse($Url = ''){
  72. self::__start();
  73. $p = static::$physical_path;
  74. $w = static::$website_path ;
  75. $req_execute = false;
  76. $url_p = empty($Url) ? $_SERVER['REQUEST_URI' ] : $Url;
  77. $local = parse_url($w);
  78. $req = parse_url($url_p);
  79. $ req_path = preg_replace('|[^w/.]|','',$req['path ']);
  80. $req_para = empty($Url) ? strstr($_SERVER['SERVER_NAME'],'.' ,true) : 'www';
  81. if(empty($Url) && substr_count($_SERVER[' SERVER_NAME'],'.') == 2 && $req_para != 'www'){
  82. self::__goto( $req_para,preg_replace('|^'.$local['path'].'|'," ",$req_path));
  83. return ;
  84. }else{
  85. $req_path_arr = empty($req_path)?array() :preg_split("|[/]+|",preg_replace('|^'.$local[' path'].'|',"",$req_path));
  86. $req_fun = array_pop($req_path_arr);
  87. if(substr($req_fun,0,2)=='__'){
  88. $req_fun = substr ($req_fun,2);
  89. }
  90. $req_path_rearr = array_filter($req_path_arr);
  91. self::__msg($req_path_rearr) );
  92. $req_temp = implode('/',$req_path_rearr);
  93. $fname = $req_temp. '/'.$req_fun;
  94. if(!empty($req_fun)&&in_array($req_fun,static::$allow_sys_fun) ){
  95. $req_fun();
  96. }else{
  97. if(!empty($req_fun)&&file_exists( $p.$fname.'.php') ){
  98. include( $p.$fname.'.php' ) ;
  99. }else{
  100. $fname = empty($req_temp) ? 'index' : $req_temp;
  101. if(file_exists($p.$fname.'.php') ){
  102. include( $p.$fname.' .php' );
  103. }else{
  104. $fname = $req_temp.'/index';
  105. if (file_exists($p.$fname.'.php')){
  106. include( $p.$fname.'. php' );
  107. }else{
  108. //この場所は、「個人ホームページ」への特別なリンクを「プロフィール/」に誘導します。自分で変更できます
  109. //例: www.xxx.com/12/ は、www.xxx.com/ プロフィールを意味します/?uid=12 または www.xxx.com/profile?uid=12
  110. $uid = is_numeric($req_temp) ? $req_temp : strstr($req_temp, '/', true);
  111. $ufun = is_numeric($ req_temp ) ? 'インデックス' : strstr($req_temp, '/');
  112. if(is_numeric($uid)){
  113. self::$uid = $uid;
  114. if(!isset($_GET['uid'] ) ) $_GET['uid'] = $uid;
  115. $fname = 'profile/'.$ufun;
  116. if(file_exists($p.$fname.'.php')){
  117. include( $p.$ fname .'.php' );
  118. }else{
  119. header("location:".$w);
  120. exit();
  121. }
  122. }else if(file_exists($p.'index.php')){
  123. $ fname = 'index';
  124. include( $p.'index.php' );
  125. }else{
  126. header("location:".$w);
  127. exit();
  128. }
  129. }
  130. }
  131. }
  132. $ ev_fname = strrpos($fname,'/')===false ? $fname : substr($fname,strrpos($fname,'/')+1);
  133. $ev_fname = static::$pretag.$ev_fname ;
  134. if( class_exists($ev_fname, false) && method_exists($ev_fname,$req_fun)){
  135. static::$linktag = $req_fun=='index' ? $fname.'/' : $fname.'/' 。 $req_fun;
  136. if($req_fun != 'init' && method_exists($ev_fname,'init')){
  137. $ev_fname::init();
  138. }
  139. $ev_fname::$req_fun();
  140. }else if ( class_exists($ev_fname, false) && method_exists($ev_fname,'index') ){
  141. static::$linktag = $fname.'/';
  142. if(method_exists($ev_fname,'init')){
  143. $ ev_fname::init();
  144. }
  145. $ev_fname::index();
  146. }else if( $fname != 'index' && class_exists(static::$pretag.'index', false) && method_exists(static : :$pretag.'index','index') ){
  147. $ev_fname = static::$pretag.'index';
  148. static::$linktag = 'index/';
  149. if(method_exists($ev_fname,' init ')){
  150. $ev_fname::init();
  151. }
  152. $ev_fname::index();
  153. }else{
  154. self::__msg('関数が存在しません!');
  155. }
  156. }
  157. }
  158. self ::__end();
  159. }
  160. //ここでは、xiaoming.baidu.com などのユーザー定義リンク (データベースに保存されている解析値を使用) を解析します
  161. // データベース内の xiaoming タグは次を指しますwww.baidu.com/blog?uid=12 または www.baidu.com/blog?uname=xiaoming (これはデータベースの設計方法によって異なります)
  162. public static function __goto($para = '',$path = ' '){
  163. $w = static::$website_path;
  164. if(empty($para)){
  165. exit('不明なリンク、解析に失敗しました、アクセスできません');
  166. }
  167. if (class_exists('Parseurl')) {
  168. $prs = Parseurl::selectone(array('tag','=',$para));
  169. self::__msg($prs);
  170. if(!empty($ prs)){
  171. $parastr = $prs['tag'];
  172. $output = array();
  173. $_GET[$prs['idtag']] = $prs['id'];
  174. parse_str($prs ['parastr'], $output );
  175. $_GET = array_merge($_GET,$output);
  176. $path = $prs['type'].'/'.preg_replace('|^/'.$prs[ 'type'].'|' ,'',$path);
  177. self::__msg($path);
  178. header('location:'.$w.$path.'?'.http_build_query($_GET)) ;
  179. exit();
  180. } else{
  181. header("location:".$w);
  182. exit();
  183. }
  184. }else{
  185. header("location:".$w);
  186. exit();
  187. }
  188. }
  189. }
  190. ? >
コードをコピー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。