1. 程式人生 > >SSI(服務器端嵌入)

SSI(服務器端嵌入)

開發 插入內容 嵌入 則表達式 lte 相對路徑 文件名 屬性 文檔

簡介

SSI(服務器端嵌入)是一組放在 HTML 頁面中的指令,當服務器向客戶端訪問提供這些頁面時,會解釋執行這些指令。它們能為已有的 HTML 頁面添加動態生成內容,不需要通過 CGI 程序來或其他的動態技術來重新改變整個頁面。

如果利用 Tomcat 作為 HTTP 服務器並需要 SSI 支持時,可以添加 SSI 支持。通常,如果你運行的不是像 Apache 那樣的服務器,就通過開發來實現這種支持。

Tomcat SSI 支持實現了與 Apache 完全一致的 SSI 指令。關於使用 SSI 指令的詳細信息,可參考Apache 的 SSI 簡介。

SSI 支持可以有兩種方式來實現:servlet 或過濾器。你只能利用其中的一種方式來提供 SSI 支持。

基於 servlet 的 SSI 支持是通過 org.apache.catalina.ssi.SSIServlet 類來實現的。一般來說,這個 servlet 映射至 URL 模式"*.shtml"。

基於過濾器的 SSI 支持則利用 org.apache.catalina.ssi.SSIFilter 類來實現。一般而言,該過濾器映射至 URL 模式 "*.shtml",但是它也可以被映射至 "*",因為它會基於 MIME 類型選擇性地啟用/禁用對 SSI 的處理。初始參數 contentType 允許你將 SSI 處理應用於 JSP 頁面、JavaScript 內容以及其他內容中。

默認 Tomcat 是不支持 SSI 的。

安裝

警告:SSI 指令可用於執行 Tomcat JVM 之外的程序。如果使用 Java SecurityManager,它會繞過你在 catalina.policy 中配置的安全策略。

為了使用 SSI servlet,要從 $CATALINA_BASE/conf/web.xml 中去除 SSI servlet 及 servlet 映射配置旁邊的 XML 註釋。

為了使用 SSI 過濾器,要從 $CATALINA_BASE/conf/web.xml 中去除 SSI 過濾器及過濾器映射配置旁邊的 XML 註釋。

只有標明為 privileged 的上下文才可以使用 SSI 功能(參看 Context 元素的 privileged 屬性)。

Servlet 配置

以下這些 servlet 初始化參數可以配置 SSI servlet 的行為:

  • buffered 是否應緩存該 servlet 的輸出?(0 = false,1 = true)默認為 0(false)。
  • debug 調試 servlet 所記錄信息的調試細節度。默認為 0。
  • expires 包含 SSI 指令的頁面失效的秒數。默認行為針對的是每個請求所應執行的所有 SSI 指令。
  • isVirtualWebappRelative “虛擬”的 SSI 指令路徑是否應被解釋為相對於上下文根目錄的相對路徑(而不是服務器根目錄)?默認為 false。
  • inputEncoding 如果無法從資源本身確定編碼,則應指定給 SSI 資源的編碼。默認為系統默認編碼。
  • outputEncoding 用於 SSI 處理結果的編碼。默認為 UTF-8。
  • allowExec 是否啟用 exec 命令?默認為 false。

過濾器配置

以下這些過濾器初始化參數可以配置 SSI 過濾器的行為:

  • contentType 在應用 SSI 處理之前必須匹配的正則表達式模式。在設計自己的模式時,不要忘記 MIME 內容類型後面可能會帶著可選的字符集:“mime/type; charset=set”。默認為 “text/x-server-parsed-html(;.*)?”。
  • debug 調試 servlet 所記錄信息的調試細節度。默認為 0。
  • expires 包含 SSI 指令的頁面失效的秒數。默認行為針對的是每個請求所應執行的所有 SSI 指令。
  • isVirtualWebappRelative “虛擬”的 SSI 指令路徑是否應被解釋為相對於上下文根目錄的相對路徑(而不是服務器根目錄)?默認為 false。
  • allowExec 是否啟用 exec 命令?默認為 false。

指令

指令采取 HTML 註釋的形式。在將頁面發送到客戶端之前,解讀指令,並用所得結果來替換指令。指令的一般形式為:

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

這些指令包括:

  • config <!--#config timefmt="%B %Y" --> 用於設定日期格式以及其他一些 SSI 處理的項目。
  • echo <!--#echo var="VARIABLE_NAME" --> 將被變量值所取代。
  • exec 在主機系統上用於運行命令。
  • include <!--#include virtual="file-name" --> 插入內容。
  • flastmod <!--#flastmod file="filename.shtml" --> 返回文件最後修改的時間。
  • fsize <!--#fsize file="filename.shtml" --> 返回文件大小。
  • 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 -->

關於使用 SSI 指令的詳細信息,可參考Apache 的 SSI 簡介。

變量

SSI servlet 當前能實現下列變量:

變量名描述
AUTH_TYPE 用於這些用戶的驗證類型:BASIC、FORM,等等。
CONTENT_LENGTH 從表單傳入數據的長度(以字節或字符數)
CONTENT_TYPE 查詢數據的 MIME 類型。比如:text/html
DATE_GMT 以格林威治標準時間(GMT)表示的當前時間與日期
DATE_LOCAL 以本地時區表示的當前日期與時間
DOCUMENT_NAME 當前文件名
DOCUMENT_URI 文件的虛擬路徑
GATEWAY_INTERFACE 服務器所使用的通用網關接口(CGI)的修訂版本,比如: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 處理信息請求的方法:GETPOST,等等
REQUEST_URI 客戶端所請求的最初頁面
SCRIPT_FILENAME 當前頁面在服務器上的位置
SCRIPT_NAME 頁面名稱
SERVER_ADDR 服務器的 IP 地址
SERVER_NAME 服務器的主機名或 IP 地址
SERVER_PORT 服務器接收請求的端口
SERVER_PROTOCOL 服務器所使用的協議,比如:HTTP/1.1
SERVER_SOFTWARE 應答客戶端請求的服務器軟件的名稱與版本號
UNIQUE_ID 用於識別當前會話(如果存在)的令牌

SSI(服務器端嵌入)