在後台勾選相應的開啓偽靜態的項 程序會將所填寫的 rewrite 格式 通過 rewritedata 函數的轉換
存進數據庫 setting 表裏面
之後更新緩存等操作時候程序從數據庫中讀出該 rewriterule 替換為相應的正則的 search 和 replace 存在 $_G['setting']['output'] 裏面。
在 discuz 各頁面中的鏈接除了小部的鏈接是在 php 程序裏面直接使用 rewriteoutput 函數 (可在 function_core.php 裏面查看) 處理成靜態的地址直接在模板裏面輸出使用外
頁面中的大部分的需要替換成靜態地址的鏈接都是在模板解析後,最後在程序包含緩存文件裏面處理的
我們打開 ./template/default/common/footer.htm 文件,在該文件最底部可以可以發現 這麼一段代碼
- <!--{eval output();}-->
- </body>
- </html>
如果我們去掉這個函數即去掉
- <!--{eval output();}-->
會發現所有的頁面都是動態的地址,不管你在後台是否開啓了偽靜態
因為 footer.htm 是幾乎所有程序模板都會引用到的腳部的模板,
大部分的模板裏面寫死的動態的地址在通過 template 函數解析後,最後包含緩存文件時,將執行 output() 這個函數 (可以在 function_core.php 裏面查看) 來處理模板裏面的地址
程序在執行 output 函數時候,如果你在後台開啓偽靜態後
該函數會將之前程序及模板輸出的所有內容 使用 ob_get_contents 函數賦值給 $content
如果你在 output() 函數 裏面
- $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 輸出整個頁面的內容
而此時的頁面才是最終和大家見面的含有偽靜態地址的頁面