SSI 如何操作

目錄

簡介

SSI (伺服器端包含) 是置於 HTML 頁面中的指令,並在頁面提供服務時於伺服器上評估。它們讓您將動態產生的內容新增至現有的 HTML 頁面,而無需透過 CGI 程式或其他動態技術提供整個頁面。

在使用 Tomcat 作為您的 HTTP 伺服器且您需要 SSI 支援時,可以在 Tomcat 中新增 SSI 支援。通常這是在開發期間進行,當您不想執行 Apache 等網頁伺服器時。

Tomcat SSI 支援實作與 Apache 相同的 SSI 指令。請參閱 Apache SSI 簡介,以取得有關使用 SSI 指令的資訊。

SSI 支援可作為 Servlet 和 Filter 使用。您應該使用其中一種提供 SSI 支援,但不能同時使用兩種。

使用類別 org.apache.catalina.ssi.SSIServlet 實作基於 Servlet 的 SSI 支援。傳統上,此 Servlet 會對應到 URL 模式「*.shtml」。

使用類別 org.apache.catalina.ssi.SSIFilter 實作基於 Filter 的 SSI 支援。傳統上,此 Filter 會對應到 URL 模式「*.shtml」,儘管它可以對應到「*」,因為它會根據 MIME 類型選擇性地啟用/停用 SSI 處理。contentType 初始化參數允許您將 SSI 處理套用至 JSP 頁面、JavaScript 或您想要的任何其他內容。

預設情況下,SSI 支援在 Tomcat 中已停用。

安裝

注意 - SSI 指令可用於執行 Tomcat JVM 外部的程式。如果您正在使用 Java SecurityManager,這將會繞過您在 catalina.policy 中的安全政策組態。

若要使用 SSI servlet,請移除 $CATALINA_BASE/conf/web.xml 中 SSI servlet 和 servlet-mapping 組態周圍的 XML 註解。

若要使用 SSI filter,請移除 $CATALINA_BASE/conf/web.xml 中 SSI filter 和 filter-mapping 組態周圍的 XML 註解。

只有標記為特權的 Context 可以使用 SSI 功能(請參閱 Context 元素的特權屬性)。

Servlet 組態

有幾個 servlet 初始化參數可用於組態 SSI servlet 的行為。

  • buffered - 這個 servlet 的輸出應該緩衝嗎?(0=否,1=是)預設為 0(否)。
  • debug - 此 servlet 記錄的訊息的偵錯詳細資料等級。預設為 0。
  • expires - 具有 SSI 指令的頁面過期前的秒數。預設行為是針對每個要求評估所有 SSI 指令。
  • isVirtualWebappRelative - 應該將「虛擬」SSI 指令路徑解釋為相對於 Context 根目錄,而不是伺服器根目錄嗎?預設為否。
  • inputEncoding - 如果無法從資源本身確定 SSI 資源的編碼,則假設的編碼。預設為預設平台編碼。
  • outputEncoding - 要用於 SSI 處理結果的編碼。預設為 UTF-8。
  • allowExec - exec 指令已啟用嗎?預設為否。

Filter 組態

有幾個 filter 初始化參數可用於組態 SSI filter 的行為。

  • contentType - 在套用 SSI 處理之前必須符合的正規表示式模式。在建立您自己的模式時,別忘了 MIME 內容類型後面可能會加上「mime/type; charset=set」形式的選用字元集,您必須考慮到這一點。預設為「text/x-server-parsed-html(;.*)?」。
  • debug - 此 servlet 記錄的訊息的偵錯詳細資料等級。預設為 0。
  • expires - 具有 SSI 指令的頁面過期前的秒數。預設行為是針對每個要求評估所有 SSI 指令。
  • isVirtualWebappRelative - 應該將「虛擬」SSI 指令路徑解釋為相對於 Context 根目錄,而不是伺服器根目錄嗎?預設為否。
  • allowExec - exec 指令已啟用嗎?預設為否。

指令

伺服器端包含會嵌入 SSI 指令在 HTML 文件中,其類型將由 SSI servlet 處理。指令採用 HTML 註解的形式。指令會在將頁面傳送給用戶端之前,以其解釋的結果取代。指令的一般形式為

<!--#directive [param=value] -->

指令為

  • config - <!--#config errmsg="Error occurred" sizefmt="abbrev" timefmt="%B %Y" --> 用於設定 SSI 錯誤訊息、SSI 處理的日期和檔案大小格式。
    全部為選用,但至少必須使用一個。可用的選項如下
    errmsg - 用於 SSI 錯誤的錯誤訊息
    sizefmt - 用於 fsize 指令中大小的格式
    timefmt - 用於 flastmod 指令中時間戳記的格式
  • echo - <!--#echo var="VARIABLE_NAME" encoding="entity" --> 將由變數的值取代。
    選用的 encoding 參數指定要使用的編碼類型。有效值為 entity (預設值)、urlnone。注意:使用 entity 以外的編碼可能會導致安全性問題。
  • exec - <!--#exec cmd="file-name" --> 用於在主機系統上執行指令。
  • exec - <!--#exec cgi="file-name" --> 此動作與 include virtual 指令相同,實際上不會執行任何指令。
  • include - <!--#include file="file-name" --> 插入內容。路徑會相對於使用此指令的文件進行詮釋,且並非相對於內容根目錄或伺服器根目錄的「虛擬」路徑。
  • include - <!--#include virtual="file-name" --> 插入內容。路徑會詮釋為相對於內容根目錄或伺服器根目錄的「虛擬」路徑(視 isVirtualWebappRelative 參數而定)。
  • flastmod - <!--#flastmod file="filename.shtml" --> 傳回檔案最後修改的時間。路徑會相對於使用此指令的文件進行詮釋,且並非相對於內容根目錄或伺服器根目錄的「虛擬」路徑。
  • flastmod - <!--#flastmod virtual="filename.shtml" --> 傳回檔案最後修改的時間。路徑會詮釋為相對於內容根目錄或伺服器根目錄的「虛擬」路徑(視 isVirtualWebappRelative 參數而定)。
  • fsize - <!--#fsize file="filename.shtml" --> 傳回檔案的大小。路徑會相對於使用此指令的文件進行詮釋,且並非相對於內容根目錄或伺服器根目錄的「虛擬」路徑。
  • fsize - <!--#fsize virtual="filename.shtml" --> 傳回檔案大小。路徑會被解釋為「虛擬」路徑,相對於內容根目錄或伺服器根目錄(視 isVirtualWebappRelative 參數而定)。
  • printenv - <!--#printenv --> 傳回所有已定義變數的清單。
  • set - <!--#set var="foo" value="Bar" --> 用於將值指定給使用者定義的變數。
  • if elif endif else - 用於建立條件式區段。例如
    <!--#config timefmt="%A" -->
    <!--#if expr="$DATE_LOCAL = /Monday/" -->
    <p>Meeting at 10:00 on Mondays</p>
    <!--#elif expr="$DATE_LOCAL = /Friday/" -->
    <p>Turn in your time card</p>
    <!--#else -->
    <p>Yoga class at noon.</p>
    <!--#endif -->

請參閱 Apache SSI 簡介,以取得更多有關如何使用 SSI 指令的資訊。

變數

SSI 變數透過 jakarta.servlet.ServletRequest 物件上的要求屬性來實作,且不限於 SSI servlet。名稱以「java.」、「javax.」、「sun」或「org.apache.catalina.ssi.SSIMediator.」開頭的變數是保留的,且無法使用。

SSI servlet 目前實作下列變數

變數名稱 說明
AUTH_TYPE 用於此使用者的驗證類型:BASIC、FORM 等。
CONTENT_LENGTH 從表單傳遞的資料長度(以位元組或字元數為單位)。
CONTENT_TYPE 查詢資料的 MIME 類型,例如「text/html」。
DATE_GMT 格林威治標準時間的目前日期和時間
DATE_LOCAL 當地時區的目前日期和時間
DOCUMENT_NAME 目前的檔案
DOCUMENT_URI 檔案的虛擬路徑
GATEWAY_INTERFACE 伺服器啟用時使用的 Common Gateway Interface 的版本:CGI/1.1。
HTTP_ACCEPT 客戶端可以接受的 MIME 類型清單。
HTTP_ACCEPT_ENCODING 客戶端可以接受的壓縮類型清單。
HTTP_ACCEPT_LANGUAGE 客戶端可以接受的語言清單。
HTTP_CONNECTION 從客戶端建立的連線管理方式:「Close」或「Keep-Alive」。
HTTP_HOST 客戶端要求的網站。
HTTP_REFERER 客戶端連結的來源文件的 URL。
HTTP_USER_AGENT 客戶端用來發出要求的瀏覽器。
LAST_MODIFIED 目前檔案的最後修改日期和時間
PATH_INFO 傳遞給 servlet 的額外路徑資訊。
PATH_TRANSLATED 變數 PATH_INFO 所提供路徑的轉譯版本。
QUERY_STRING URL 中「?」之後的查詢字串。
QUERY_STRING_UNESCAPED 未解碼的查詢字串,所有 shell 超字元都以「\」跳脫。
REMOTE_ADDR 提出請求的使用者遠端 IP 位址。
REMOTE_HOST 提出請求的使用者遠端主機名稱。
REMOTE_PORT 提出請求的使用者遠端 IP 位址的埠號。
REMOTE_USER 使用者的驗證名稱。
REQUEST_METHOD 發出資訊請求的方法:「GET」、「POST」等。
REQUEST_URI 客戶端最初請求的網頁。
SCRIPT_FILENAME 目前網頁在伺服器上的位置。
SCRIPT_NAME 網頁的名稱。
SERVER_ADDR 伺服器的 IP 位址。
SERVER_NAME 伺服器的主機名稱或 IP 位址。
SERVER_PORT 伺服器接收請求的埠號。
SERVER_PROTOCOL 伺服器使用的通訊協定。例如:「HTTP/1.1」。
SERVER_SOFTWARE 回應客戶端請求的伺服器軟體名稱和版本。
UNIQUE_ID 如果已建立,用於識別目前階段的權杖。