Apache HTTP 伺服器版本 2.4
說明 | 具背景知識的智慧型過濾器組態模組 |
---|---|
狀態 | 基本 |
模組識別碼 | filter_module |
原始檔案 | mod_filter.c |
相容性 | 版本 2.1 及更新版本 |
此模組可讓輸出內容過濾器能以智慧化且有背景知識的方式進行組態。舉例來說,即使內容類型事先未知(例如代理),也可設定 apache 以不同的過濾器處理不同的內容類型。
mod_filter
運作方式為在過濾器鏈中加入間接層。我們並未在鏈中加入過濾器,而是加入過濾器管理程式,作為條件轉發至過濾器提供者。任何內容過濾器都可用作 mod_filter
的提供者;不需要變更現有的過濾器模組(儘管有助於簡化)。
在傳統過濾器模型中,過濾器會使用 AddOutputFilter
和同類指令無條件插入。然後,每個過濾器都需要決定是否執行,而且伺服器管理員幾乎沒有調整鏈條配置的彈性。
相反地,mod_filter
允許伺服器管理員在過濾器鏈條的組態上擁有很大的彈性。事實上,過濾器可以根據複雜的布林 表示法 來插入。這樣可以概括 AddOutputFilterByType
所提供的有限彈性。
圖 1: 傳統過濾器模型
在傳統模型中,輸出過濾器是從內容產生器 (處理常式) 到用戶端的簡單鏈條。只要過濾器鏈條可以正確組態,這樣可以正常執行,但當需要依據處理常式的結果,以動態方式組態過濾器時,就會發生問題。
圖 2: mod_filter
模型
mod_filter
透過在過濾器鏈條中引入間接參考的方式執行。我們不是在鏈條中插入過濾器,而是插入過濾器套件,它會依序有條件地調配到過濾器提供者。任何內容過濾器都可以用作 mod_filter
的提供者;不需要變更現有的過濾器模組 (但有可能簡化它們)。一個過濾器可以有多個提供者,但單一要求最多只會執行一個提供者。
過濾器鏈條包含過濾器套件的任意個執行個體,這些執行個體每個可能都有任意數量的提供者。特殊狀況是無條件調度的單一提供者:這等於直接將提供者過濾器插入鏈條中。
使用 mod_filter
組態過濾器鏈條共有三個階段。有關指令的詳細資訊,請見下方。
FilterDeclare
指令宣告過濾器,並指定名稱與過濾器類型。只有在過濾器不是預設類型 AP_FTYPE_RESOURCE 時才需要。FilterProvider
指令註冊擁有過濾器的提供者。過濾器可用 FilterDeclare
來宣告,如果沒有宣告,FilterProvider
將隱含地以預設類型 AP_FTYPE_RESOURCE 宣告。提供者必須由一些模組用 ap_register_output_filter
註冊。FilterProvider
的最後一個參數是一個表示式:當且僅當表示式評估為 true 時,才會選擇提供者來執行請求。此表示式可以評估 HTTP 請求或回應標頭、環境變數或此請求使用的處理常式。與早期版本不同,mod_filter 現在支援涉及多個條件的複雜表示式,且包含 AND / OR 邏輯 (&& / ||) 和括號。表示式語法的詳細資訊會在 ap_expr 文件 中描述。FilterChain
指令會從已宣告的智慧過濾器中建置過濾器鏈,提供在鏈的開頭或結尾插入過濾器、移除過濾器或清除鏈的彈性。mod_filter 通常只對 HTTP 狀態為 200 (OK) 的回應執行過濾。如果您想過濾擁有其他回應狀態的文件,可以設定 filter-errordocs
環境變數,而它將在所有回應執行,無論狀態是什麼。如果您想更精確,可以使用 FilterProvider
的表示式條件。
FilterProvider
指令已從 httpd 2.2 中變更:match
和 dispatch
參數已被一個更通用的 expression
取代。一般而言,可以使用以下方式將 match/dispatch 配對轉換成表示式的兩邊
"dispatch = 'match'"
請求標頭、回應標頭和環境變數現在會根據語法 %{req:foo}、%{resp:foo} 和 %{env:foo} 分別來詮釋。變數 %{HANDLER} 和 %{CONTENT_TYPE} 也受支援。
請注意,配對不再支援子字串配對。它們可以用正規表示式配對來取代。
AddOutputFilterByType
的簡單案例FilterDeclare SSI FilterProvider SSI INCLUDES "%{CONTENT_TYPE} =~ m|^text/html|" FilterChain SSI
FilterProvider SSI INCLUDES "%{HANDLER} = 'server-parsed'" FilterChain SSI
FilterDeclare gzip CONTENT_SET FilterProvider gzip inflate "%{req:Accept-Encoding} !~ /gzip/" FilterChain gzip
FilterProvider unpack jpeg_unpack "%{CONTENT_TYPE} = 'image/jpeg'" FilterProvider unpack gif_unpack "%{CONTENT_TYPE} = 'image/gif'" FilterProvider unpack png_unpack "%{CONTENT_TYPE} = 'image/png'" FilterProvider downsample downsample_filter "%{CONTENT_TYPE} = m|^image/(jpeg|gif|png)|" FilterProtocol downsample "change=yes" FilterProvider repack jpeg_pack "%{CONTENT_TYPE} = 'image/jpeg'" FilterProvider repack gif_pack "%{CONTENT_TYPE} = 'image/gif'" FilterProvider repack png_pack "%{CONTENT_TYPE} = 'image/png'" <Location "/image-filter"> FilterChain unpack downsample repack </Location>
歷來,各個濾器的責任在於確保替換後的內容會適當地顯示在 HTTP 回應標頭中,且在做出不合法變更時,該濾器不會執行。這對濾器作者而言是一大負擔,因為他們必須在每個濾器中重新實作一些共通功能。
Cache-Control: no-transform
標頭。mod_filter
試圖提供這些濾器實作細節的通用處理方式,減少內容過濾模組所需的複雜性。這項工作仍進行中;
實作其中一些功能,以便與 Apache 2.0 模組保持向後相容。對於 httpd 2.1 和更新版本,FilterProtocol
ap_register_output_filter_protocol
和 ap_filter_protocol
API 能讓過濾模組宣告自己的行為。
同時,
不應干擾想要處理所有通訊協定面向的濾器。預設情況(例如,沒有任何 mod_filter
指令時),FilterProtocol
會讓標頭保持不變。mod_filter
在撰寫本文件時,此功能在很大程度上尚未經過測試,因為一般使用的模組都是設計為可與 2.0 協作。使用此功能的模組應先仔細測試。
說明 | 將某個輸出濾器指定給特定的媒體類型 |
---|---|
語法 | AddOutputFilterByType |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_filter |
相容性 | 在 2.3.7 版本中移到 之前有嚴重的限制 |
此指令會根據回應的 媒體類型
,為要求啟用特定輸出 過濾
機制。
下列範例使用 DEFLATE
濾器,此濾器由
提供。系統會在將所有標示為 mod_deflate
text/html
或 text/plain
的輸出(靜態或動態)傳送到用戶端之前,先壓縮這些輸出。
AddOutputFilterByType DEFLATE text/html text/plain
如果您希望將內容交由多個濾器處理,必須使用分號區隔這些濾器的名稱。同時也可以為這些濾器中的每個濾器使用一個 AddOutputFilterByType
指令。
在下列組態中,標示為 text/html
的所有指令碼輸出會先由 INCLUDES
篩選器處理,然後再由 DEFLATE
篩選器處理。
<Location "/cgi-bin/"> Options Includes AddOutputFilterByType INCLUDES;DEFLATE text/html </Location>
說明 | 組態篩選器鏈 |
---|---|
語法 | FilterChain [+=-@!]filter-name ... |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | 選項 |
狀態 | 基本 |
模組 | mod_filter |
這會根據已宣告的篩選器組態實際篩選器鏈。FilterChain
會使用任意數量的引數,每個引數的前綴可能都是一個控制符號,用來決定要執行什麼動作
+filter-name
@filter-name
-filter-name
=filter-name
!
filter-name
+filter-name
說明 | 宣告一個智慧型篩選器 |
---|---|
語法 | FilterDeclare filter-name [type] |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | 選項 |
狀態 | 基本 |
模組 | mod_filter |
此指令會宣告一個輸出篩選器,並搭配一個標頭或環境變數,用來決定執行時期組態。第一個引數是 filter-name,用於 FilterProvider
、FilterChain
和 FilterProtocol
指令中。
最後的(選用)引數是篩選器的類型,而會使用 ap_filter_type
值,也就是 RESOURCE
(預設值)、CONTENT_SET
、PROTOCOL
、TRANSCODE
、CONNECTION
或 NETWORK
。
說明 | 處理正確的 HTTP 協定控管 |
---|---|
語法 | FilterProtocol filter-name [provider-name] proto-flags |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | 選項 |
狀態 | 基本 |
模組 | mod_filter |
這會指示 mod_filter
處理,以確保篩選器在不應該執行時不會執行,而 HTTP 回應標頭會根據篩選器的影響正確設定。
這個指令有兩種格式。如果有三個引數,就會特別套用到 filter-name,以及那個篩選器的 provider-name。如果只有兩個引數,就會在篩選器執行「任何」提供者時套用到 filter-name。
使用這個指令指定的旗標會合併到底層提供者可能已向 mod_filter
註冊的旗標中。例如,一個篩選器可能內部指定與 change=yes
相等的內容,但模組的特定組態可能會覆寫成 change=no
。
proto-flags 會是一個或多個以下項目
change=yes|no
change=1:1
byteranges=no
proxy=no
proxy=transform
Cache-Control: no-transform
標頭的方式轉換回應。cache=no
說明 | 註冊內容濾器 |
---|---|
語法 | FilterProvider filter-name provider-name expression |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | 選項 |
狀態 | 基本 |
模組 | mod_filter |
此指令註冊智慧型濾器的提供者。唯當串接設備首次呼叫時,expression 宣告求值為 true,才會呼叫提供者。
provider-name 必須已透過載入註冊名稱至 ap_register_output_filter
的模組註冊。
expression 是 ap_expr。
mod_include
說明 | 取得來自 mod_filter 的除錯/診斷資訊 |
---|---|
語法 | FilterTrace filter-name level |
內容 | 伺服器設定,虛擬主機,目錄 |
狀態 | 基本 |
模組 | mod_filter |
此指令從 mod_filter
產生除錯資訊。其設計有助於測試和除錯提供者(濾器模組),雖然它也可能協助 mod_filter
本身。
除錯輸出取決於設定的 level。
0
(預設值)1
mod_filter
會記錄通過濾器傳遞至錯誤記錄的區塊和旅級,在提供者處理它們之前。這類似於 mod_diagnostics 所產生的資訊。2
(尚未實作)