2011-02-10 122 views
6

好的,這可能聽起來有點瘋狂,但在這裏忍受一分鐘。用PHP編寫的SSI解析器?

我正在使用SSI包含頁眉,頁腳和菜單的標準網站上工作。包含的文件使用SSI條件來處理不同的瀏覽器,一些#include嵌套和一些#set/#if技巧來突出顯示菜單中的當前頁面。換句話說,它不僅僅是SSI中的#include指令。

我敢肯定,有些人可能會與美學爭論,但實際上它對靜態HTML非常適用。

現在,問題在於:我想從我的PHP腳本中「#include」相同的SSI解析的頁眉和頁腳html文件,從而避免了代碼重複,並且仍然保持站點的統一外觀。如果PHP運行在通常的mod_php環境中,那麼我可以通過使用PHP的virtual()函數來完成這一點。不幸的是,該網站使用FastCGI/suexec來運行PHP(這樣每個VirtualHost都可以作爲一個不同的用戶運行),並且這會打破virtual()。我一直在用PHP編寫的一個相當簡單的SSI解析器(它處理#includes和一些非常簡單的#if語句),但我想要一個更通用的解決方案。所以,在我堅持和寫一些可能錯誤的,更完整的SSI解析器之前,有誰知道用PHP編寫的完整的SSI解析器?當然,我也對其他解決方案開放,這些解決方案在我所概述的限制條件下工作。

非常感謝您的時間。

+1

我不會用「`#include`嵌套和`#set` /`#if` trickery」* static * HTML來調用SSI包含的文件。 ;)否則,有趣的問題。 :D – deceze 2011-02-10 02:19:17

+0

我知道的唯一實現是http://nanoweb.si.kz/manual/mod_include.html - 但它只是實現了三個標準函數,並不構成很多解析器。 – mario 2011-02-10 02:34:01

回答

1

我意識到這是一個古老的問題,但幾年前我遇到了同樣的問題,雖然使用perl實現。我繼續前進,並分叉了以前的嘗試,並且實現了一個完整的apache(2.2.22)mod_include模擬器/解析器作爲perl模塊。http://search.cpan.org/dist/CGI-apacheSSI/lib/CGI/apacheSSI.pm不久後,我發現了apache output filters,並意識到如何完美解決方案以滿足我的需求。基本上,您可以告訴apache解析腳本的輸出,就好像它是.shtml或.php(或其他)文件一樣。所以你可以從perl或php(或其他)腳本輸出SSI標記,並用apache解析。這是你如何能做到這(在你的.htaccess文件):

AddOutputFilter INCLUDES .cgi 

這是正常的CGI文件,但請注意,這增加了相當多的開銷所有.cgi文件被執行,所以我其實這樣做是爲了讓它運行爲隨後其輸出解析的CGI,而無需額外開銷添加到正常的CGI文件創建一個特殊的擴展:

<Files ~ ".pcgi$"> 
    Options +SymLinksIfOwnerMatch +Includes 
    AddOutputFilter INCLUDES .pcgi 
</Files> 

爲PHP你可能只是這樣做:

<Files ~ ".pphp$"> 
    Options +SymLinksIfOwnerMatch +Includes 
    AddOutputFilter INCLUDES .pphp 
</Files> 

,這應該做的伎倆!希望能幫助那裏的人。