Rumah pembangunan bahagian belakang tutorial php php快速url重写实例代码

php快速url重写实例代码

Jul 25, 2016 am 09:12 AM

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_flag magic_quotes_gpc off
  5. php_flag register_globals off
  6. #-------------- .htaccess end ---------------
复制代码

重写功能引入:让站点根目录的index.php末尾写上下列代码,重写就开启了(正常条件:1.apache的重写配置成功,且开启了.htaccess支持的.2.站点根目录的.htaccess文件设置好了.3.class.rewrite.php类文件在index.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这个页面,这个必然会执行,可用来控制本页面内函数访问权限或本页面全局变量
  3. public static function init(){
  4. //if (!defined('SITE_PASS')){
  5. echo self::$linktag.'
    ';//self::$linktag是页面解析位置路径值,会常使用.
  6. //}
  7. }
  8. //当访问"http://bbs.it-home.org/testpk/"时会执行
  9. public static function index(){
  10. echo 'test';
  11. }
  12. //当访问"http://bbs.it-home.org/testpk/blank"时会执行或写作"http://bbs.it-home.org/testpk/index/blank"一般"index/"都是可以被省略的
  13. public static function blank(){}
  14. }
  15. ?>
复制代码

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')那么系统将允许链接访问phpinfo内容了,当http://bbs.it-home.org/phpinfo或http://bbs.it-home.org/......./phpinfo时就会直接执行phpinfo这个函数,不需要phpinfo.php模块文件
  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. //设置调试Rewrite::__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. //调试函数
  30. public static function __msg($str){
  31. if(static::$debug){
  32. echo "n
    n".print_r($str,true)."n
    Salin selepas log masuk
    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解析调用,如在test1.php模块页面中执行了Rwrite::__parseurl('/test2/show')这句,将调用test2.php模块页面中的show方法(Rw_test2这个class的方法)
  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 = strtolower(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. //这个地方是对"个人主页"的这种特殊链接定向到"profile/"了,可自己修改
  109. //如:www.xxx.com/12/将表示www.xxx.com/profile/?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) ? 'index' : 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('Function Not Exist!');
  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. ?>
复制代码


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bekerja dengan Data Sesi Flash di Laravel Bekerja dengan Data Sesi Flash di Laravel Mar 12, 2025 pm 05:08 PM

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Pembalakan PHP: Amalan Terbaik untuk Analisis Log PHP Pembalakan PHP: Amalan Terbaik untuk Analisis Log PHP Mar 10, 2025 pm 02:32 PM

Pembalakan PHP adalah penting untuk memantau dan menyahpepijat aplikasi web, serta menangkap peristiwa kritikal, kesilapan, dan tingkah laku runtime. Ia memberikan pandangan yang berharga dalam prestasi sistem, membantu mengenal pasti isu -isu, dan menyokong penyelesaian masalah yang lebih cepat

Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Mar 14, 2025 am 11:42 AM

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

Respons HTTP yang dipermudahkan dalam ujian Laravel Respons HTTP yang dipermudahkan dalam ujian Laravel Mar 12, 2025 pm 05:09 PM

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 skrip sembang php terbaik di codecanyon 12 skrip sembang php terbaik di codecanyon Mar 13, 2025 pm 12:08 PM

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Terangkan konsep pengikatan statik lewat dalam PHP. Terangkan konsep pengikatan statik lewat dalam PHP. Mar 21, 2025 pm 01:33 PM

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom. Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom. Mar 28, 2025 pm 05:12 PM

Artikel ini membincangkan menambah fungsi khusus kepada kerangka kerja, memberi tumpuan kepada pemahaman seni bina, mengenal pasti titik lanjutan, dan amalan terbaik untuk integrasi dan debugging.

See all articles