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 輸出整個頁面的內容

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