Apache HTTP Server 2.4 版本
有兩種環境變數會影響 Apache HTTP Server。
第一,有由基礎作業系統控制的環境變數。這些變數會在伺服器啟動前設定。它們可以用於設定檔中的擴充功能,並可以使用 PassEnv 指令選擇性地傳遞給 CGI 腳本和 SSI。
第二,Apache HTTP Server 提供一種儲存資訊至命名變數的方法,這些變數也稱為「環境變數」。這些資訊可用於控制各種作業,例如記錄或存取控制。變數也用作與外部程式(例如 CGI 腳本)通訊的方法。本文文件討論各種處理和使用這些變數的方法。
儘管這些變數稱為「環境變數」,但它們與基礎作業系統控制的環境變數並不相同。反之,這些變數儲存在內部 Apache 架構中、並在其中處理。只有當它們提供給 CGI 腳本和伺服器端包含腳本時,它們才會變成真正的作業系統環境變數。如果您想要操作伺服器本身執行的作業系統環境,您必須使用作業系統外殼提供的標準環境操作機制。
相關模組 | 相關指令 |
---|---|
在 Apache 設定環境變數最基本的方式,就是使用無條件的 SetEnv
指令。環境變數也可以使用 PassEnv
指令,從啟動伺服器的 shell 環境傳遞而來。
為了彈性運用,mod_setenvif
所提供的指令,可讓環境變數根據特定要求的特性,以逐要求為基礎設定。舉例來說,變數只有在特定瀏覽器(使用者代理)提出要求時,或是只有在特定來源標頭 [sic] 被找到時,才會設定。而 mod_rewrite
的RewriteRule
透過使用 [E=...]
選項,提供了更大的彈性,用來設定環境變數。
最後,mod_unique_id
會為每個要求設定環境變數 UNIQUE_ID
,此設定值在非常特定的條件下,保證在「所有」要求中都是唯一的。
除了所有在 Apache 設定中設定,以及從 shell 傳遞的環境變數之外,CGI 腳本和 SSI 頁面會取得一組環境變數,此組變數包含要求的後設資料,這是 CGI 規格書 所要求的。
suexec
用來啟動 CGI 腳本時,在 CGI 腳本啟動之前,環境會下降為一組安全變數。安全變數清單是在 suexec.c
中,於編譯時設定的。SetEnv
指令會執行,這表示諸如 SetEnvIf
和 RewriteCond
等指令,不會看到用它設定的變數。DirectoryIndex
,或是使用mod_autoindex
產生目錄清單,每個請求的環境變數將不會繼承在子要求中。此外,SetEnvIf
指令在子要求內不會被個別評估,這是因為 API 階段mod_setenvif
採取措施。相關模組 | 相關指令 |
---|---|
環境變數的主要用途之一,就是要將資訊傳達給 CGI 程式。如上所述,傳遞給 CGI 程式之環境包含標準的請求元資料,以及任何在 Apache 組態中設定的變數。更多詳情,請見CGI 教學。
經由 mod_include
的 INCLUDES
篩選器處理的伺服器解析 (SSI) 文件可以使用 echo
元素來列印環境變數,並可在流程控制元素中使用環境變數,令整個頁面的組成取決於請求的特性。Apache 也提供 SSI 頁面標準 CGI 環境變數,如上所述。更多詳情,請見SSI 教學。
基於環境變數的伺服器存取可以利用 Require env
和 Require not env
指令做控制。結合 SetEnvIf
,這能讓基於用戶端特性的伺服器存取控制更靈活。例如,你可以使用這些指令拒絕特定瀏覽器的存取 (使用者代理)。
環境變數可以使用 LogFormat
選項 %e
在存取記錄中做記錄。此外,關於是否紀錄請求的決定,可以用 CustomLog
指令的條件式表單,基於環境變數的狀態而做出。結合 SetEnvIf
,這讓用於記錄哪些請求的控制更靈活。舉例來說,你可以選擇不記錄檔名以 gif
結尾的請求,或是選擇只記錄來自你子網路外的用戶端請求。
指令可以使用環境變數存在與否來決定是否在對用戶端的回應中放置某個 HTTP 標題。這允許例如僅在請求中從用戶端收到對應標題時才傳送某個回應標題。Header
由
使用 mod_ext_filter
指令設定的外部濾網可以根據環境變數使用 ExtFilterDefine
disableenv=
和 enableenv=
選項進行啟動。
中的 TestString 的 RewriteCond
%{ENV:variable}
形式允許
的轉寫引擎根據環境變數進行決定。注意,在沒有 mod_rewrite
ENV:
前置詞的
中存取的變數實際上並非環境變數。相較之下,它們是 mod_rewrite
特有的變數,無法從其他模組存取。mod_rewrite
互通性問題導致引入了修改 Apache 在與特定用戶端對話時行為的機制。為了讓這些機制盡可能靈活,它們會透過定義環境變數來呼叫,通常使用
,儘管例如也可以使用 BrowserMatch
和 SetEnv
。PassEnv
這會強制請求被視為 HTTP/1.0 請求,即使它在後面的方言中也是如此。
如果你啟用了 DEFLATE
濾網,這個環境變數會忽略瀏覽器的接受編碼設定,並無條件傳送壓縮輸出的內容。
在回應標題傳回給用戶端之前,這會將所有 Vary
欄位從回應標題中移除。有些用戶端未正確解譯這個欄位;設定這個變數可以解決這個問題。設定這個變數也意味著 force-response-1.0。
這會強制以 HTTP/1.1 請求進行 HTTP/1.0 回應給用戶端。它起初是因為 AOL 代理伺服器問題而實作的。有些 HTTP/1.0 用戶端在給予 HTTP/1.1 回應時可能無法正確行為,而這可以使用來與它們互通。
當設定為「1」,這個變數會停用 mod_deflate
提供的 DEFLATE
輸出濾鏡,以用於除了 text/html
之外的內容類型。如果您想要使用靜態壓縮的檔案, mod_negotiation
也會評估該變數(不僅針對 gzip,還針對與「identity」不同的所有編碼)。
當設定時, mod_deflate
的 DEFLATE
濾鏡將會關閉,而 mod_negotiation
將會拒絕傳送編碼的資源。
可使用於 2.2.12 及更新版本
當設定時, mod_cache
將不會儲存原本可以快取的回應。此環境變數不會影響快取中是否已經儲存的回應是否會提供給目前的請求。
當設定時,此變數將會停用 KeepAlive
。
此變數會影響 mod_negotiation
的行為。如果變數包含語言標籤(例如 ja
或 x-klingon
), mod_negotiation
會嘗試傳送具有該語言的變體。如果沒有此類變體,則會套用一般的 協商 程序。
此變數會強制伺服器在將重新導向傳送到用戶端時更加小心。此變數通常用於用戶端在處理重新導向時有已知問題的情形。一開始實作此變數的目的是為了解決 Microsoft WebFolders 軟體在使用 DAV 方法處理目錄資源的重新導向時所出現的問題。
可使用於 2.0.54 之後的版本
當 Apache 對用戶端要求發出重新導向時,回應中會包含一些實際的文字,如果用戶端無法(或不會)自動追蹤重新導向,這些文字就會顯示。Apache 通常會根據其所使用的字元集來標記文字,而其字元集是 ISO-8859-1。
但是,如果重新導向到的是使用不同字元集的頁面,有些損壞的瀏覽器版本會嘗試使用重新導向文字中的字元集,而不是實際頁面的字元集。例如,這可能會導致錯誤地呈現希臘文。
設定此環境變數會讓 Apache 省略重新導向文字的字元集,而這些損壞的瀏覽器會正確使用目標頁面的字元集。
傳送沒有明確指定字元組的錯誤頁面,可能會允許現有瀏覽器 (MSIE) 進行跨網站指令碼攻擊,而這些瀏覽器不遵循 HTTP/1.1 規格,但會嘗試從內容「猜測」字元組。此類瀏覽器容易被誤導,使用 UTF-7 字元組,且輸入資料 (例如要求 URI) 中的 UTF-7 內容不會被用來防止跨網站指令碼攻擊的正常逃脫機制轉義。
這些指令會修改 mod_proxy
的協定行為。請參閱 mod_proxy
和 mod_proxy_http
文件,以取得更多詳細資料。
在 2.4.59 及更新版本中提供
這個變數允許在類 CGI 模組中執行的指令碼,提供它自己的 Content-Length HTTP 回應標頭。它只應該設定在包含受信任指令碼的組態區段。
從版本 2.4 開始,Apache 對於如何將 HTTP 標頭轉換成在 mod_cgi
及其他模組中的環境變數更為嚴格:先前,標頭名稱中的任何無效字元只會轉換成底線。這允許透過標頭插入執行一些潛在的跨網站指令碼攻擊(請參閱 Unusual Web Bugs,投影片 19/20)。
如果您必須支援傳送損毀標頭,且無法修正的用戶端,那麼涉及 mod_setenvif
和 mod_headers
的簡單解決方法讓您仍可接受這些標頭
# # The following works around a client sending a broken Accept_Encoding # header. # SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
較早的版本建議在 httpd.conf 中包含以下列來處理已知的用戶端問題。由於受影響的用戶端不再存在於實體環境,所以此組態可能不再需要。
# # The following directives modify normal HTTP response behavior. # The first directive disables keepalive for Netscape 2.x and browsers that # spoof it. There are known problems with these browser implementations. # The second directive is for Microsoft Internet Explorer 4.0b2 # which has a broken HTTP/1.1 implementation and does not properly # support keepalive when it is used on 301 or 302 (redirect) responses. # BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 # # The following directive disables HTTP/1.1 responses to browsers which # are in violation of the HTTP/1.0 spec by not being able to understand a # basic 1.1 response. # BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0
這個範例會在存取日誌中隱藏影像請求。它可以輕易變更,防止記錄特定目錄或防止記錄來自特定主機的請求。
SetEnvIf Request_URI \.gif image-request SetEnvIf Request_URI \.jpg image-request SetEnvIf Request_URI \.png image-request CustomLog "logs/access_log" common env=!image-request
這個範例示範如何防止並非來自您伺服器的人員,在他們的網頁上使用您伺服器中的影像作為內嵌影像。這個並非建議的組態,但它能在受限的情況下運作。我們假設您所有的影像都位於名為 /web/images
的目錄中。
SetEnvIf Referer "^http://www\.example\.com/" local_referal # Allow browsers that do not send Referer info SetEnvIf Referer "^$" local_referal <Directory "/web/images"> Require env local_referal </Directory>
有關此技術的更多資訊,請參閱 ServerWatch 上的「Keeping Your Images from Adorning Other Sites」教學。