<address id="997j9"></address>

                    首頁 > 運營 > 幫助中心 > 正文

                    phpwind的rewrite重寫原理

                    2019-10-17 22:51:21
                    字體:
                    來源:轉載
                    供稿:網友

                    就是一般我們用echo print 輸出字符到頁面上的時候,意味著只要執行到了echo,php就會立即輸出到客戶端,但php有幾個和緩沖相關的函數,他可以控制你輸出的行為,就是不立馬輸出,而是等你調用了ob_flush/flush函數,才輸出。而pw就是利用了這個原理,等頁面所有的內容都生成完畢了,最后調footer()時,ob_get_contents(),獲取緩沖的內容,通過正則批量替換url,構造rewrite的url格式。

                    關于ob,其實有兩種主要的使用場景,一個是實現頁面壓縮輸出 - ob_gzhandler;再一個是在ajax/自定義api返回數據時,程序執行過程中,你不知道前面的程序是否有些意外的輸出字符如空格、空行等,他們在數據返回時會造成很多意外情況,所以可以在你輸出數據前,清除前面的緩沖內容,重新開始輸出。

                    官方默認的重寫規則(注:重寫是web服務器 - 如apache、nginx或應用容器tomcat的功能,不是程序語言自己的功能),如pw的一條重寫規則 - apache:
                     

                    復制代碼
                    代碼如下:

                    RewriteRule ^(.*)-htm-(.*)$ $1.php?$2

                     

                    首先,我們分析他的構成。當我們打開 global.php 文件,找到 :

                     

                    復制代碼
                    代碼如下:

                    <?php
                    $db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();
                    ?>

                     

                    我們會發現,這個全局文件打開了一個ob_start,并且進行一些判斷。這個是pw系統進行rewrite的一個關鍵。

                    然后我們再找到footer()函數:

                     

                    復制代碼
                    代碼如下:

                    <?php
                    function footer(){
                    global $db,$db_obstart,$db_footertime,$db_htmifopen,$P_S_T,$mtablewidth,$db_ceoconnect,$wind_version,$imgpath,$stylepath,$footer_ad,$db_union,$dbinfo,$timestamp;
                    Update_ol();
                    if($db){
                    $qn=$db->query_num;
                    }
                    $ft_gzip=($db_obstart==1 ? "Gzip enabled" : "Gzip disabled").$db_union[3];
                    if ($db_footertime == 1){
                    $t_array = explode(' ',microtime());
                    $totaltime = number_format(($t_array[0]+$t_array[1]-$P_S_T),6);
                    $wind_spend = "Total $totaltime(s) query $qn,";
                    }
                    $ft_time=get_date($timestamp,'m-d H:i');
                    include PrintEot('footer');
                    $output = str_replace(array('<!--<!---->','<!---->'),array('',''),ob_get_contents());
                    if($db_htmifopen){
                    $output = preg_replace(
                    "/<a(s*[^>]+s*)href=(["|']?)([^"'>s]+.php?[^"'>s]+)(["|']?)/ies",
                    "Htm_cv('3','<a1href="')",
                    $output
                    );
                    }
                    ob_end_clean();
                    $db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();
                    echo $output;
                    flush;
                    exit;
                    }
                    ?>

                     

                    common.php中:

                     

                    復制代碼
                    代碼如下:

                    function parseHtmlUrlRewrite($html, $flag) {
                    return $flag ? preg_replace("//<a(/s*[^/>]+/s*)href/=([/"|/']?)((index|cate|thread|read|faq|rss)/.php/?[^/"/'>/s]+/s?)[/"|/']?/ies", "Htm_cv('//3','<a//1href=/"')", $html) : $html;
                    }</p> <p>/**
                    * url處理
                    *
                    * @param string $url
                    * @param string $tag
                    * @return string
                    */
                    function Htm_cv($url, $tag) {
                    return stripslashes($tag) . urlRewrite($url) . '"';
                    }</p> <p>function urlRewrite($url) {
                    global $db_htmifopen, $db_dir, $db_ext;
                    if (!$db_htmifopen) return $url;
                    $tmppos = strpos($url, '#');
                    $add = $tmppos !== false ? substr($url, $tmppos) : '';
                    $turl = str_replace(array('.php?', '=', '&amp;', '&', $add), array($db_dir, '-', '-', '-', ''), $url);//pw的重寫規則在這里進行字符的替換
                    $turl != $url && $turl .= $db_ext;
                    return $turl . $add;
                    }
                    發表評論 共有條評論
                    用戶名: 密碼:
                    驗證碼: 匿名發表
                    久久久国产精品午夜一区 欧美最爽乱婬视频免费看 日产精品99久久久久久 精品国产污污免费网站入口 亚洲碰碰人人Av熟女天堂

                                    <address id="997j9"></address>

                                      <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>