SSI(服務器端嵌入)
簡介
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 | 處理信息請求的方法: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 | 用於識別當前會話(如果存在)的令牌 |
SSI(服務器端嵌入)