(參考apache手冊及百度百科:http://baike.baidu.com/view/188371.htm)
訪問靜態頁面時,頁面有一個模塊無法顯示並報錯“an error occurred while processing this directive”,查看原html文件,發現該處是通過SSI的命令include進來的:
<!--#include virtual="/html/attention/expo.html"--> 通過改正引入文件的路徑,成功引入。這裏做一下筆記:
【SSI】
Server Side Include,服務器端嵌入(包含),以apache爲例,SSI是通過apche的mod_include模塊實現的,是指服務器將內容發送給瀏覽器之前,根據頁面中的指令,對頁面進行處理的過程。這是apache中文手冊的定義:'SSI是嵌入HTML頁面中的指令,在頁面被提供時由服務器進行運算,以對現有HTML頁面增加動態生成的內容,而無須通過CGI程序提供其整個頁面,或者使用其他動態技術。
至於什麼時候應當用SSI,而什麼時候應當用某些程序生成整個頁面,取決於頁面中有多少內容是靜態的,又有多少內容需要在每次頁面被提供時重新計算SSI是一種增加小段動態信息的好方法,比如當前時間。如果你的頁面大部分內容是在被提供時動態生成的,那就要另找方案了。
”我遇到的是在文章頁引入“關注”模塊,文章是不變的,但是關注每天都不同,因此採用SSI,以便舊的文章頁的關注也能夠實時更新。
如何使你的Apache服務端支持SSI?
Apache默認是不支持SSI的,需要我們更改httpd.conf來進行配置。 我這裏以windows平臺的Apache 2.0.x爲例:打開conf目錄下的httpd.conf文件,
1. 搜索“AddType text/html .shtml”,搜索結果: # AddType text/html .shtml # AddOutputFilter INCLUDES .shtml 把這兩行前面的#去掉。
(解釋: 並非所有文件中的ssi指令都會被解析,必須告訴Apache應該解析哪些文件。如果我們的指令放在了.htm類型的文件中,那麼就需要在上面兩條命令中分別加入.htm一項,否則便不會解析未指定的文件中的ssi命令。 因爲命令是放在註釋中的,故不解析的將顯示空。
有兩種方法使Apache解析帶有特定後綴名的文件,上面這是一種,另一種是使用 xBitHack命令,詳見apache手冊)
2. 然後搜索“Options Indexes FollowSymLinks” 在搜索到的那一行後面添加“ Includes” 即將該行改變爲: Options Indexes FollowSymLinks Includes
SSI指令基本格式
程序代碼: <!-– 指令名稱="指令參數"> 如 程序代碼: <!--#include file="info.htm"-->
說明: 1.<!-- -->;是HTML語法中表示註釋,當WEB服務器不支持SSI時,會忽略這些信息。
2.#include 爲SSI指令之一。
3.file 爲include的參數,info.htm爲參數值,在本指令中指將要包含的文檔名。
注意: 1.<!--與#號間無空格,只有SSI指令與參數間存在空格。
2.上面的標點="",一個也不能少。
3.SSI指令是大小寫敏感的,因此參數必須是小寫纔會起作用。
SSI指令
除了include指令,ssi還有很多很帥的指令,如:echo config exec set 甚至條件表達式if else ,詳細見apache手冊。
#include指令詳解
Include命令可以把其它文檔中的文字或圖片插入到當前被解析的文檔中,這是整個SSI的關鍵所在。通過Include命令只需要改動一個文件就可以瞬間更新整個站點!
Include命令具有兩個不同的參數:
Virtual:給出到服務器端某個文檔的虛擬路徑。例如:<!--#include virtual="/includes/header.html" --> (我的理解就是相對於網站根目錄的路徑)
File:給出當前目錄的相對路徑其中不能使用"../",也不能使用絕對路徑。例如: <!--#include file="header.html" --> 這就要求每一個目錄中都包含一個header.html文件。(我的理解就是被包含的文件與該文件同級或者下一級目錄或下下..級目錄下的文件,如同級的test.html,或者同級目錄下的test/test1.html)
在使用<!--#include virtual=時,遇到一個問題,就是引入的文件同其不在同一個域名下,但是在同一臺服務器上。通過在當前域名下建立到其他域名的文件的軟鏈接(符號鏈接)解決。