服務器端內嵌

服務器端內嵌Server Side Includes,亦簡稱為SSI)是一種大多數僅應用於互聯網上的簡單解釋性服務器端腳本語言。

SSI最常見的用法是將一個或多個文件的內容包含在網頁服務器的頁面上。例如,一張包含每日報價的頁面可以通過下面一段代碼將報價單包含在頁面中:

<!--#include virtual="../quote.txt" -->

若更改quote.txt文件,則所有包含此文件的頁面都會展示最新的每日報價。這個包含不止局限於文件,而且還有來自程序的文本輸出,或者是如當前時間的系統變量。

服務器端內嵌常用於在整個站點中包含一段公共代碼,例如頁眉、頁腳與導航欄。使用控制代碼可以有條件地將導航欄包含在內。

為了讓網頁服務器辨識啟用了服務器端內嵌的HTML文件,從而運行這段代碼。則文件名應有特殊的擴展名,默認為.shtml.stm.shtm;或者服務器設置文件的執行標記以配置為允許服務器端內嵌。[1]

作為一種簡單的編程語言,服務器端內嵌僅支持一種數據類型:純文本。它的控制流程相當簡單,支持選擇,但循環不被原生支持,且只可以通過包含遞歸式或URL重定向的方式進行。這種簡單設計的語言使得其比大多數服務器端腳本語言都更易於上手學習使用,而複雜的服務器端處理過程通常使用功能更豐富的編程語言之一來完成。服務器端內嵌擁有圖靈完備性[2]

ApacheLiteSpeednginxlighttpdIIS五大主流網頁服務器軟件均支持此種語言。

SSI的語法相當簡單:<!--#directive parameter=value parameter=value -->。這些指令都放在HTML注釋區,所以若SSI功能並未啟用時,除非其預覽頁面源代碼,否則用戶將不會在頁面上看到這些SSI指令。請注意這種語言的語法中不允許在開頭的"<"和指令之間存在空格。 [3]

指令

編輯

最常用的指令集

編輯
指令 參數 描述 舉例
include file或virtual 此指令可能是最常用的SSI指令,允許其中一個文檔中的內容被包含在另外一個文檔內。file或virtual參數指定被包含的文件(HTML頁面、文本文件、腳本等)。包含了其他文件中的內容或是運行CGI腳本的結果。若進程沒有權限閱讀文件或執行腳本,文件包含將會失敗。「virtual」參數指定相對於域根的目標,而「file」參數則指定相對於當前文件目錄的路徑。當使用「file」參數時,禁止引用絕對路徑。除非被明確配置,對更高級目錄(..)的訪問通常是被禁止的。Apache文檔相對「file」參數更推薦使用「virtual」參數。 <!--#include virtual="menu.cgi" -->

<!--#include file="footer.html" -->

Apache的SSI教程規定格式為在閉合元素的「-->」之前留出空格。

exec cgi或cmd 此指令運行服務器上的程序、腳本亦或是Shell命令。「cmd」參數特指服務端的命令;「cgi」參數特指CGI腳本的路徑。當前SSI腳本的PATH_INFO和QUERY_STRING均會傳遞到CGI腳本中,結果應運行「exec cgi」而非「include virtual」。 <!--#exec cgi="/cgi-bin/foo.cgi" -->

<!--#exec cmd="ls -l" -->
echo var 此指令將顯示特定HTTP環境變量的內容。這些變量包括HTTP_USER_AGENT、LAST_MODIFIED和HTTP_ACCEPT。 <!--#echo var="REMOTE_ADDR" -->
config timefmt、sizefmt或errmsg 此指令配置日期、時間、文件大小和錯誤信息(SSI命令執行失敗的時候反饋)的顯示格式。 <!--#config timefmt="%y %m %d" -->

<!--#config sizefmt="bytes" -->

<!--#config errmsg="SSI命令运行失败!" -->
flastmod或fsize file或virtual 這些指令顯示特定文檔最近一次被修改的時間,或者是特定文檔的大小。「file」或「virtual」參數指明所使用的文檔。「file」參數將文檔定義為相對於文檔路徑;「virtual」參數將文檔定義為相對於文檔根目錄。 <!--#flastmod virtual="index.html" -->

<!--#fsize file="script.pl" -->
printenv   此指令輸出所有的變量和它們的值,這些變量包含環境變量和用戶定義變量。它沒有任何屬性。 <!--#printenv -->

控制指令

編輯
指令 參數 描述 舉例
if expr 用於進行一個物理頁面可能會生成的多個邏輯頁面的條件測試。 <!--#if expr="${Sec_Nav}" -->
<!--#include virtual="" -->
<!--#endif -->
elif expr 與編程語言中的進一步條件測試具有相同用途。 <!--#if expr="${Sec_Nav}" -->
<!--#include virtual="secondary_nav.txt" -->
<!--#elif expr="${Pri_Nav}" -->
<!--#include virtual="primary_nav.txt" -->
<!--#endif -->
else 如果沒有if和elif指令捕捉到現在的情況,這裡的事情就會發生。 <!--#if expr="${Sec_Nav}" -->
<!--#include virtual="secondary_nav.txt" -->
<!--#else -->
<!--#include virtual="article.txt" -->
<!--#endif -->
endif 參見上方例子。
set var、value 設定SSI變量的值。(雖然同時出現在Apache httpd和lighttpd中,但不是所有的軟件都支持此指令。) <!--#set var="foo" value="bar" -->

另請參閱

編輯

參考文獻

編輯
  1. ^ Configuring your server to permit SSI. Apache Tutorial: Introduction to Server Side Includes. The Apache Software Foundation. [24 June 2015]. (原始內容存檔於2021-02-25). 
  2. ^ Server Side Includes Turing machine, Jan Schejbal. Retrieved 2010-08-12. Janschejbal.de. [2012-12-06]. (原始內容存檔於2020-06-24). 
  3. ^ Basic SSI Directives and Syntax. 2010-01-20 [2010-01-20]. (原始內容存檔於2021-01-25). 

外部連結

編輯