Apache HTTP 伺服器 2.4 版本
說明 | 根據要求的特性設定環境變數 |
---|---|
狀態 | 基本 |
模組識別碼 | setenvif_module |
原始檔 | mod_setenvif.c |
mod_setenvif
模組讓您可以根據請求的不同面向是否與您指定的正規表示式相符,來設定內部環境變數。這些環境變數可用於伺服器的其他部分,來判定是否採取行動,同時也供 CGI 腳本和 SSI 頁面使用。
這些指令會依照其於設定檔內出現的順序來加以考慮。因此,可以使用更複雜的順序,例如此範例,在瀏覽器是 Mozilla 但並非 MSIE 時設定 netscape
。
BrowserMatch ^Mozilla netscape BrowserMatch MSIE !netscape
當伺服器透過內部 子請求 來搜尋路徑,例如尋找 DirectoryIndex
或使用 mod_autoindex
產生目錄清單時,不會在子請求中繼承每個請求的環境變數。此外,由於 mod_setenvif
在 API 階段採取行動,因此 SetEnvIf
指令也不會在子請求中個別加以評估。
說明 | 設定根據 HTTP User-Agent 的條件式環境變數 |
---|---|
語法 | BrowserMatch 正規表示式 [!]env-variable[=值] [[!]env-variable[=值]] ... |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_setenvif |
是 BrowserMatch
指令的特別案例,它根據 SetEnvIf
User-Agent
HTTP 要求標頭設定環境變數。以下兩行程式碼具有相同效果
BrowserMatch Robot is_a_robot SetEnvIf User-Agent Robot is_a_robot
其他範例
BrowserMatch ^Mozilla forms jpeg=yes browser=netscape BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript BrowserMatch MSIE !javascript
說明 | 設定環境變數,根據 User-Agent 不區分大小寫 |
---|---|
語法 | BrowserMatchNoCase regex [!]env-variable[=value] [[!]env-variable[=value]] ... |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_setenvif |
指令的語意與 BrowserMatchNoCase
指令相同。但是,它不區分大小寫。例如:BrowserMatch
BrowserMatchNoCase mac platform=macintosh BrowserMatchNoCase win platform=windows
和 BrowserMatch
指令是 BrowserMatchNoCase
和 SetEnvIf
指令的特別案例。以下兩行程式碼具有相同效果SetEnvIfNoCase
BrowserMatchNoCase Robot is_a_robot SetEnvIfNoCase User-Agent Robot is_a_robot
說明 | 根據要求的屬性設定環境變數 |
---|---|
語法 | SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_setenvif |
指令根據要求的屬性定義環境變數。第一個引數中指定的 attribute 可以是四項中的其中一項SetEnvIf
Host
、User-Agent
、Referer
和 Accept-Language
。可以使用正規表示法指定一系列要求標頭。Remote_Host
- 提出要求之客戶端的主機名稱(如果可用)Remote_Addr
- 提出要求之客戶端的 IP 位址Server_Addr
- 已接收要求之伺服器的 IP 位址(僅限於 2.0.43 之後版本)Request_Method
- 使用中方法的名稱(GET
、POST
、等值)Request_Protocol
- 製作要求中協定的名稱和版本(例如,「HTTP/0.9」、「HTTP/1.1」等)Request_URI
- HTTP 要求列中所要求的資源 - 一般來說,在網址中,這是位在架構和主機部分且不含查詢字串的部分。查看 RewriteCond
指令的 mod_rewrite
以取得如何搭配 QUERY 字串的額外資訊。SetEnvIf
指令針對先前比對的結果進行測試。以這種方式進行測試時,只有先前 SetEnvIf[NoCase]
指令定義的環境變數可供使用。「先前」表示這些指令定義在較廣的作用範圍內(例如整個伺服器),或先前在目前的指令範圍內。只有在請求特徵不符,並且沒有使用正規表示法表示第二個參數(
其餘參數會提供要設定的變數名稱,以及可選擇設定的值。這些參數的格式為
varname
,或!varname
,或varname=value
在第一個格式中,值會設定為「1」。如果已定義第二個格式中的變數,則會將其移除,而第三個格式會將變數設定為 value
指定的文字值。自 2.0.51 版開始,Apache httpd 將會辨識 $1
..$9
出現在 value 的情況,並將它們替換為 regex 的括號分組子表示式。$0
使你可以存取與該模式配對的整個字串。
SetEnvIf Request_URI "\.gif$" object_is_image=gif SetEnvIf Request_URI "\.jpg$" object_is_image=jpg SetEnvIf Request_URI "\.xbm$" object_is_image=xbm SetEnvIf Referer www\.mydomain\.example\.com intra_site_referral SetEnvIf object_is_image xbm XBIT_PROCESSING=1 SetEnvIf Request_URI "\.(.*)$" EXTENSION=$1 SetEnvIf ^TS ^[a-z] HAVE_TS
如果請求的是影像檔案,前三個將設定環境變數 object_is_image
,而第四個會在轉介頁位於 www.mydomain.example.com
網站的某個位置時設定 intra_site_referral
。
最後一個範例會在請求包含任何標頭時設定環境變數 HAVE_TS
,這些標頭從「TS」開頭,而其對應值從字元集 [a-z] 開頭。
說明 | 根據 ap_expr 式設定環境變數 |
---|---|
語法 | SetEnvIfExpr expr [!]env-variable[=value] [[!]env-variable[=value]] ... |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_setenvif |
指令根據 式 定義環境變數。這些式會在執行期間評估,並以與 SetEnvIfExpr
SetEnvIf
相同的方式在
SetEnvIfExpr "tolower(req('X-Sendfile')) == 'd:\images\very_big.iso')" iso_delivered SetEnvIfExpr "tolower(req('X-Sendfile')) =~ /(.*\.iso$)/" iso-path=$1
這會在我們的應用程式每次嘗試透過 X-Sendfile
傳送時設定環境變數 iso_delivered
。
一個更有用的範例會在遠端 IP 位址根據 RFC 1918 是私有位址時設定變數 rfc1918。
SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918
<If>
可用於達成類似的結果。mod_filter
說明 | 根據請求的屬性設定環境變數,不區分大小寫 |
---|---|
語法 | SetEnvIfNoCase 屬性正規表示法 [!]env-變數[=值] [[!]env-變數[=值]] ... |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_setenvif |
SetEnvIfNoCase
指令在語義上與 SetEnvIf
指令相同,它們的差別僅在於正規表示法比對時不區分大小寫。例如:
SetEnvIfNoCase Host Example\.Org site=example
如果 HTTP 請求標頭欄位 Host:
已包含並包含 Example.Org
、example.org
或任何其他組合,site
環境變數將設定為「example
」。