国产欧美二区三区-国产欧美高清-国产欧美国产精品第二区-国产欧美国产精品第一区-小说区 图片区-小说区 综合区 都市激情

當(dāng)前位置: 首頁 > 站長資訊 > 正文頁面

discuz教程:偽靜態(tài)功能原理分析

經(jīng)常看到論壇上有人詢問,為什么偽靜態(tài)失效了,為什么列表頁無法實(shí)現(xiàn)偽靜態(tài)。那么discuz! X2是如何實(shí)現(xiàn)偽靜態(tài)功能的呢?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

為了闡述這個問題,我們從兩個角度入手:HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

第一,偽靜態(tài)是如何作用的?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

我們都知道,當(dāng)我們通過地址訪問一個頁面的時候,訪問的是服務(wù)器上的一個實(shí)體文件。例如,訪問http://www.xxx.com/index.html, 訪問的是網(wǎng)站根目錄下的index.html文件。然而,對于論壇,如果每一個頁面(主題列表,內(nèi)容頁)都是一個靜態(tài)的實(shí)體文件,那文件的數(shù)量將何其之 多,并且不能動態(tài)的實(shí)時的展現(xiàn)論壇的內(nèi)容。如果僅僅使用動態(tài)訪問,那么不利于增強(qiáng)搜索引擎的友好面,因此,我們將使用偽靜態(tài),展現(xiàn)形式是.html這樣的 靜態(tài)頁面,而實(shí)際上依然是通過動態(tài)腳本來處理的。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

discuz! X2的偽靜態(tài)處理利用了服務(wù)器的rewrite模塊,通過rewrite模塊的配置的規(guī)則,對請求的url進(jìn)行轉(zhuǎn)換。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

下面我們以Apache的rewrite模塊為例,詳細(xì)說明一下。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

RewriteRule ^(.*)/forum-(/w+)-([0-9]+)/.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

這是一條Apache的偽靜態(tài)規(guī)則HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

rewrite規(guī)則匹配的是/forum-XX-XX.html的url請求,經(jīng)過規(guī)則轉(zhuǎn)換后,實(shí)際請求的鏈接是/forum.php?mod=forumdisplay&fid=XX&page=XX,是不是很熟悉,這就是請求論壇主題列表的動態(tài)鏈接啦。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

所以問題來了,如果偽靜態(tài)請求失效/forum-XX-XX.html,提示頁面無法顯示,有幾種錯誤的可能性呢?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

1.規(guī)則生效了有沒有?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

如果服務(wù)器不支持rewrite,如果忘了重啟服務(wù),如果.htaccess文件放置的位置不對,等等,都可能導(dǎo)致rewrite功能沒有運(yùn)行,這樣肯定是不行的哦。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

所以,先檢查下rewrite功能是否正常吧,如果使用空間的話,可以咨詢下空間商的說。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

2.規(guī)則錯誤了有沒有?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

如果規(guī)則是這樣的HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

RewriteRule ^(.*)/forum-(/w+)-([0-9]+)/.html$ $1/forum.php?mod=forumdisplayHiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

少了東西是不是,所以/forum-XX-XX.html只會訪問/forum.php?mod=forumdisplay,這樣列表頁肯定不顯示了HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

如果規(guī)則更夸張一些HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

forumdisplay.php這個文件都沒有,頁面當(dāng)然無法顯示,這也就解釋了,過去版本(如X1.5 7.0)的有些規(guī)則無法在X2中直接使用的原因了。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

所以規(guī)則正確才是頁面能夠正常訪問的前提啊~如果使用新的規(guī)則,發(fā)現(xiàn)無法訪問了,首先檢查規(guī)則有沒有寫錯了。(其實(shí)這些在論壇后臺偽靜態(tài)設(shè)置的地方都可以查的到,根本不用各位站長費(fèi)心的嘛)HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

3.網(wǎng)絡(luò)正常有沒有?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

如果拼命在偽靜態(tài)中找尋原因,沒留意站點(diǎn)已經(jīng)無法正常訪問,是不是有種緣木求魚的感覺,站點(diǎn)無法訪問的原因請參看官方論壇相關(guān)教程。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

分析到這一步,相信大家對于偽靜態(tài)如何起作用已經(jīng)有一定的了解了,那么我們轉(zhuǎn)向下一個問題。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

第二,偽靜態(tài)如何在論壇顯示?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

為什么我的站偽靜態(tài)開啟了,但在首頁還是顯示動態(tài)鏈接呀?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

那么下面講解下,偽靜態(tài)是如何顯示出來的。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

了解discuz!的同學(xué)應(yīng)該知道,在論壇模板文件中,所以的url鏈接都是以動態(tài)的形式返回輸出的。(在模板中看不到靜態(tài)鏈接?是的)按照常規(guī),應(yīng)該都顯示動態(tài)鏈接,那么靜態(tài)鏈接又是如何實(shí)現(xiàn)。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

在模板文件的footer.htm文件中,有這樣一行代碼。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

<!--{eval output();}-->HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

這段代碼解析后,直接調(diào)用了function_core.php中的output()函數(shù)。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

我們來看看output函數(shù)執(zhí)行了哪些操作。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

if($_G['setting']['rewritestatus'] || !empty($havedomain))HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

{HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$content = ob_get_contents();HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$content = output_replace($content);HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

ob_end_clean();HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$_G['gzipcompress'] ? ob_start('ob_gzhandler') : ob_start();HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

echo $content;HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

}HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

程 序執(zhí)行到這里的時候,執(zhí)行了一個 $content = ob_get_contents();的操作, ob_get_contents()獲取當(dāng)前輸出緩存中的所有數(shù)據(jù),也就是說,模板返回的頁面并沒有直接顯示給用戶,而是被$content變量獲取到 了。然后進(jìn)入output_replace函數(shù)執(zhí)行內(nèi)容替換(各種替換,不僅僅是偽靜態(tài)鏈接替換),最后又echo輸出。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

于是,替換工作就放在output_replace函數(shù)中,HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

if(!empty($_G['setting']['output']['str']['search']))HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

{HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

if(empty($_G['setting']['domain']['app']['default'])) {HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$_G['setting']['output']['str']['replace'] = str_replace('{CURHOST}', $_G['siteurl'], $_G['setting']['output']['str']['replace']);HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

}HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$content = str_replace($_G['setting']['output']['str']['search'], $_G['setting']['output']['str']['replace'], $content);HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

}HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

這一部分,替換的是當(dāng)前站點(diǎn)的域名,將寫在模板中的'{CURHOST}'占位符替換為$_G['siteurl']的值。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

if(!empty($_G['setting']['output']['preg']['search']))HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

{HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

if(empty($_G['setting']['domain']['app']['default'])) {HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$_G['setting']['output']['preg']['search'] = str_replace('/{CURHOST/}', preg_quote($_G['siteurl']), $_G['setting']['output']['preg']['search']);HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$_G['setting']['output']['preg']['replace'] = str_replace('{CURHOST}', $_G['siteurl'], $_G['setting']['output']['preg']['replace']);HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

}HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$content = preg_replace($_G['setting']['output']['preg']['search'], $_G['setting']['output']['preg']['replace'], $content);HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

}HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

這一個部分則是替換偽靜態(tài)鏈接,具體的實(shí)現(xiàn)過程,我簡單介紹下,沒有興趣的同學(xué)可以跳過。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

$_G['setting']['output']['preg']['search']數(shù)組中保存的數(shù)據(jù),類似于HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

/<a href/="()forum.php/?mod/=forumdisplay&(amp;)?fid/=(/w+)(&page/=(/d+))?"([^/>]*)/>/eHiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

對應(yīng)的$_G['setting']['output']['preg']['replace']中的一條數(shù)據(jù)為HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

rewriteoutput('forum_forumdisplay', 0, '/1', '/3', '/5', '/6')HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

這里利用了preg_replace函數(shù)的一個特性,當(dāng)匹配模式中帶有e修飾符,用eval進(jìn)行后向引用替換,即替換變量和執(zhí)行對應(yīng)函數(shù)。也就是 說,preg_replace將匹配到的子串,以參數(shù)的形式傳入rewriteoutput函數(shù),rewriteoutput函數(shù)返回的值作為替換的內(nèi) 容。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

(頁面上有幾個鏈接,將會執(zhí)行幾次rewriteoutput函數(shù),這就是開啟偽靜態(tài)略微影響性能的原因)HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

問題又來了,偽靜態(tài)不被替換這是為什么呢?HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

原因很簡單,因?yàn)槭窃陧撁孑敵鲋安抛龅奶鎿Q,所以一切程序上做可能做的手腳都是浮云了。真正起作用的僅僅是輸出之前的鏈接,是不是符合偽靜態(tài)的替換規(guī)則呢。類似于/forum.php?mod=viewthread&tid=XX#lastpost這樣的鏈接自然是無法被成功替換的咯HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

至此,偽靜態(tài)是如何替換并顯示的機(jī)理就算介紹完畢了。HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

偽靜態(tài)功能的介紹就先到此,希望能對站長解決偽靜態(tài)問題提供一些幫助~HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

 HiS網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口

  

此文由 網(wǎng)站目錄_網(wǎng)站網(wǎng)址收錄與提交入口 編輯,未經(jīng)允許不得轉(zhuǎn)載!:

相關(guān)文章