<-
Apache > HTTP 伺服器 > 文件 > 版本 2.4 > 模組

Apache 模組 mod_filter

可用語言:  en  |  fr 

說明具背景知識的智慧型過濾器組態模組
狀態基本
模組識別碼filter_module
原始檔案mod_filter.c
相容性版本 2.1 及更新版本

摘要

此模組可讓輸出內容過濾器能以智慧化且有背景知識的方式進行組態。舉例來說,即使內容類型事先未知(例如代理),也可設定 apache 以不同的過濾器處理不同的內容類型。

mod_filter 運作方式為在過濾器鏈中加入間接層。我們並未在鏈中加入過濾器,而是加入過濾器管理程式,作為條件轉發至過濾器提供者。任何內容過濾器都可用作 mod_filter 的提供者;不需要變更現有的過濾器模組(儘管有助於簡化)。

Support Apache!

主題

指令

錯別字修正清單

參見

top

智慧型過濾

在傳統過濾器模型中,過濾器會使用 AddOutputFilter 和同類指令無條件插入。然後,每個過濾器都需要決定是否執行,而且伺服器管理員幾乎沒有調整鏈條配置的彈性。

相反地,mod_filter 允許伺服器管理員在過濾器鏈條的組態上擁有很大的彈性。事實上,過濾器可以根據複雜的布林 表示法 來插入。這樣可以概括 AddOutputFilterByType 所提供的有限彈性。

top

過濾器宣告、提供者與鏈條

[This image displays the traditional filter model]
圖 1: 傳統過濾器模型

在傳統模型中,輸出過濾器是從內容產生器 (處理常式) 到用戶端的簡單鏈條。只要過濾器鏈條可以正確組態,這樣可以正常執行,但當需要依據處理常式的結果,以動態方式組態過濾器時,就會發生問題。

[This image shows the mod_filter model]
圖 2: mod_filter 模型

mod_filter 透過在過濾器鏈條中引入間接參考的方式執行。我們不是在鏈條中插入過濾器,而是插入過濾器套件,它會依序有條件地調配到過濾器提供者。任何內容過濾器都可以用作 mod_filter 的提供者;不需要變更現有的過濾器模組 (但有可能簡化它們)。一個過濾器可以有多個提供者,但單一要求最多只會執行一個提供者。

過濾器鏈條包含過濾器套件的任意個執行個體,這些執行個體每個可能都有任意數量的提供者。特殊狀況是無條件調度的單一提供者:這等於直接將提供者過濾器插入鏈條中。

top

組態鏈條

使用 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 指令會從已宣告的智慧過濾器中建置過濾器鏈,提供在鏈的開頭或結尾插入過濾器、移除過濾器或清除鏈的彈性。
top

過濾和回應狀態

mod_filter 通常只對 HTTP 狀態為 200 (OK) 的回應執行過濾。如果您想過濾擁有其他回應狀態的文件,可以設定 filter-errordocs 環境變數,而它將在所有回應執行,無論狀態是什麼。如果您想更精確,可以使用 FilterProvider 的表示式條件。

top

從 Apache HTTP Server 2.2 組態升級

FilterProvider 指令已從 httpd 2.2 中變更:matchdispatch 參數已被一個更通用的 expression 取代。一般而言,可以使用以下方式將 match/dispatch 配對轉換成表示式的兩邊

"dispatch = 'match'"

請求標頭、回應標頭和環境變數現在會根據語法 %{req:foo}%{resp:foo}%{env:foo} 分別來詮釋。變數 %{HANDLER}%{CONTENT_TYPE} 也受支援。

請注意,配對不再支援子字串配對。它們可以用正規表示式配對來取代。

top

範例

伺服器端包含 (SSI)
取代 AddOutputFilterByType 的簡單案例
FilterDeclare SSI
FilterProvider SSI INCLUDES "%{CONTENT_TYPE} =~ m|^text/html|"
FilterChain SSI
伺服器端包含 (SSI)
與上面相同,但會對處理常式 (傳統 SSI 行為;會處理 .shtml 檔案) 進行調度。
FilterProvider SSI INCLUDES "%{HANDLER} = 'server-parsed'"
FilterChain SSI
用 mod_deflate 模擬 mod_gzip
僅在「Accept-Encoding」標頭中沒有「gzip」時,才插入 INFLATE 過濾器。此過濾器會和 ftype CONTENT_SET 一起執行。
FilterDeclare gzip CONTENT_SET
FilterProvider gzip inflate "%{req:Accept-Encoding} !~ /gzip/"
FilterChain gzip
影像降採樣
假設我們要降採樣所有網頁影像,且要有 GIF、JPEG 和 PNG 的過濾器。
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>
top

協定處理

歷來,各個濾器的責任在於確保替換後的內容會適當地顯示在 HTTP 回應標頭中,且在做出不合法變更時,該濾器不會執行。這對濾器作者而言是一大負擔,因為他們必須在每個濾器中重新實作一些共通功能。

mod_filter 試圖提供這些濾器實作細節的通用處理方式,減少內容過濾模組所需的複雜性。這項工作仍進行中;FilterProtocol 實作其中一些功能,以便與 Apache 2.0 模組保持向後相容。對於 httpd 2.1 和更新版本,ap_register_output_filter_protocolap_filter_protocol API 能讓過濾模組宣告自己的行為。

同時,mod_filter 不應干擾想要處理所有通訊協定面向的濾器。預設情況(例如,沒有任何 FilterProtocol 指令時),mod_filter 會讓標頭保持不變。

在撰寫本文件時,此功能在很大程度上尚未經過測試,因為一般使用的模組都是設計為可與 2.0 協作。使用此功能的模組應先仔細測試。

top

AddOutputFilterByType 指令

說明將某個輸出濾器指定給特定的媒體類型
語法AddOutputFilterByType filter[;filter...] media-type [media-type] ...
內容伺服器設定、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態基本
模組mod_filter
相容性在 2.3.7 版本中移到 mod_filter 之前有嚴重的限制

此指令會根據回應的 媒體類型,為要求啟用特定輸出 過濾機制。

下列範例使用 DEFLATE 濾器,此濾器由 mod_deflate 提供。系統會在將所有標示為 text/htmltext/plain 的輸出(靜態或動態)傳送到用戶端之前,先壓縮這些輸出。

AddOutputFilterByType DEFLATE text/html text/plain

如果您希望將內容交由多個濾器處理,必須使用分號區隔這些濾器的名稱。同時也可以為這些濾器中的每個濾器使用一個 AddOutputFilterByType 指令。

在下列組態中,標示為 text/html 的所有指令碼輸出會先由 INCLUDES 篩選器處理,然後再由 DEFLATE 篩選器處理。

<Location "/cgi-bin/">
    Options Includes
    AddOutputFilterByType INCLUDES;DEFLATE text/html
</Location>

參見

top

FilterChain 指令

說明組態篩選器鏈
語法FilterChain [+=-@!]filter-name ...
內容伺服器設定、虛擬主機、目錄、.htaccess
覆寫選項
狀態基本
模組mod_filter

這會根據已宣告的篩選器組態實際篩選器鏈。FilterChain 會使用任意數量的引數,每個引數的前綴可能都是一個控制符號,用來決定要執行什麼動作

+filter-name
filter-name 新增到篩選器鏈的尾端
@filter-name
filter-name 插入篩選器鏈的開頭
-filter-name
從篩選器鏈中移除 filter-name
=filter-name
清空篩選器鏈,然後插入 filter-name
!
清空篩選器鏈
filter-name
等於 +filter-name
top

FilterDeclare 指令

說明宣告一個智慧型篩選器
語法FilterDeclare filter-name [type]
內容伺服器設定、虛擬主機、目錄、.htaccess
覆寫選項
狀態基本
模組mod_filter

此指令會宣告一個輸出篩選器,並搭配一個標頭或環境變數,用來決定執行時期組態。第一個引數是 filter-name,用於 FilterProviderFilterChainFilterProtocol 指令中。

最後的(選用)引數是篩選器的類型,而會使用 ap_filter_type 值,也就是 RESOURCE(預設值)、CONTENT_SETPROTOCOLTRANSCODECONNECTIONNETWORK

top

FilterProtocol 指令

說明處理正確的 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
指定篩選器是否會變更內容,可能會包含內容長度。2.4.7 和更新版本支援「no」引數。
change=1:1
篩選器會變更內容,但不會變更內容長度
byteranges=no
濾器無法運作於位元組範圍上,且需要完整輸入
proxy=no
濾器不應該在 proxy 環境下執行
proxy=transform
濾器以不符合 HTTP Cache-Control: no-transform 標頭的方式轉換回應。
cache=no
濾器會讓輸出無法快取(例如透過引發隨機內容變更)
top

FilterProvider 指令

說明註冊內容濾器
語法FilterProvider filter-name provider-name expression
內容伺服器設定、虛擬主機、目錄、.htaccess
覆寫選項
狀態基本
模組mod_filter

此指令註冊智慧型濾器的提供者。唯當串接設備首次呼叫時,expression 宣告求值為 true,才會呼叫提供者。

provider-name 必須已透過載入註冊名稱至 ap_register_output_filter 的模組註冊。

expressionap_expr

參見

top

FilterTrace 指令

說明取得來自 mod_filter 的除錯/診斷資訊
語法FilterTrace filter-name level
內容伺服器設定,虛擬主機,目錄
狀態基本
模組mod_filter

此指令從 mod_filter 產生除錯資訊。其設計有助於測試和除錯提供者(濾器模組),雖然它也可能協助 mod_filter 本身。

除錯輸出取決於設定的 level

0(預設值)
不產生除錯資訊。
1
mod_filter 會記錄通過濾器傳遞至錯誤記錄的區塊和旅級,在提供者處理它們之前。這類似於 mod_diagnostics 所產生的資訊。
2(尚未實作)
會在提供者之前將傳遞給暫存檔案的完整資料傾印。僅適用於單一使用者的除錯;這不支援同時存取。

可用語言:  en  |  fr 

top

留言

注意事項
這不是問答區段。放置在這裡的意見應提出建議,改進文件或伺服器,且若已實作或視為無效/與主題無關,則可能會由我們的協調員移除。對於如何管理 Apache HTTP Server 的問題,應導向我們在 Libera.chat 上的 IRC 頻道 #httpd,或傳送至我們的 郵寄清單