x2 程序處理偽靜態分析

在後台勾選相應的開啓偽靜態的項 程序會將所填寫的 rewrite 格式 通過 rewritedata 函數的轉換

存進數據庫 setting 表裏面

之後更新緩存等操作時候程序從數據庫中讀出該 rewriterule 替換為相應的正則的 search 和 replace 存在 $_G['setting']['output'] 裏面。

在 discuz 各頁面中的鏈接除了小部的鏈接是在 php 程序裏面直接使用 rewriteoutput 函數 (可在 function_core.php 裏面查看) 處理成靜態的地址直接在模板裏面輸出使用外

頁面中的大部分的需要替換成靜態地址的鏈接都是在模板解析後,最後在程序包含緩存文件裏面處理的

我們打開 ./template/default/common/footer.htm 文件,在該文件最底部可以可以發現 這麼一段代碼

  1. <!--{eval output();}-->
  2. </body>
  3. </html>

如果我們去掉這個函數即去掉

  1. <!--{eval output();}-->

會發現所有的頁面都是動態的地址,不管你在後台是否開啓了偽靜態

因為 footer.htm 是幾乎所有程序模板都會引用到的腳部的模板,

大部分的模板裏面寫死的動態的地址在通過 template 函數解析後,最後包含緩存文件時,將執行 output() 這個函數 (可以在 function_core.php 裏面查看) 來處理模板裏面的地址

程序在執行 output 函數時候,如果你在後台開啓偽靜態後

該函數會將之前程序及模板輸出的所有內容 使用 ob_get_contents 函數賦值給 $content

如果你在 output() 函數 裏面

  1. $content = ob_get_contents();

之前使用 exit(); 斷一下  

你會發現其實論壇的頁面是可以正常打開使用的,只是區別是此時的論壇頁面中的地址是全部是為動態地址

因為下面才是真正處理地址的部分

$content = ob_get_contents();   之後 output_replace 函數對 $content 的內容中的地址進行替換

output_replace 使用的正則的 search 和 replace 的字符串就是之前存進 $_G['setting']['output'] 中的替換字符串

在 output_replace 處理之後 此時的 $content 的內容中的後台設置需要為靜態的地址就已經為偽靜態

替換成功之後 output 函數 再使用 ob_end_clean 對之前 ob_start 後輸出的內容進行清除

之後 echo $content 輸出整個頁面的內容

而此時的頁面才是最終和大家見面的含有偽靜態地址的頁面