<-
Apache > HTTP Server > 文件 > 2.4 版本

Apache 中的環境變數

可用的語言:  en  |  fr  |  ja  |  ko  |  tr 

有兩種環境變數會影響 Apache HTTP Server。

第一,有由基礎作業系統控制的環境變數。這些變數會在伺服器啟動前設定。它們可以用於設定檔中的擴充功能,並可以使用 PassEnv 指令選擇性地傳遞給 CGI 腳本和 SSI。

第二,Apache HTTP Server 提供一種儲存資訊至命名變數的方法,這些變數也稱為「環境變數」。這些資訊可用於控制各種作業,例如記錄或存取控制。變數也用作與外部程式(例如 CGI 腳本)通訊的方法。本文文件討論各種處理和使用這些變數的方法。

儘管這些變數稱為「環境變數」,但它們與基礎作業系統控制的環境變數並不相同。反之,這些變數儲存在內部 Apache 架構中、並在其中處理。只有當它們提供給 CGI 腳本和伺服器端包含腳本時,它們才會變成真正的作業系統環境變數。如果您想要操作伺服器本身執行的作業系統環境,您必須使用作業系統外殼提供的標準環境操作機制。

Support Apache!

另請參閱

top

設定環境變數

基本環境操作

在 Apache 設定環境變數最基本的方式,就是使用無條件的 SetEnv 指令。環境變數也可以使用 PassEnv 指令,從啟動伺服器的 shell 環境傳遞而來。

條件式逐要求設定

為了彈性運用,mod_setenvif 所提供的指令,可讓環境變數根據特定要求的特性,以逐要求為基礎設定。舉例來說,變數只有在特定瀏覽器(使用者代理)提出要求時,或是只有在特定來源標頭 [sic] 被找到時,才會設定。而 mod_rewriteRewriteRule 透過使用 [E=...] 選項,提供了更大的彈性,用來設定環境變數。

唯一識別碼

最後,mod_unique_id 會為每個要求設定環境變數 UNIQUE_ID,此設定值在非常特定的條件下,保證在「所有」要求中都是唯一的。

標準 CGI 變數

除了所有在 Apache 設定中設定,以及從 shell 傳遞的環境變數之外,CGI 腳本和 SSI 頁面會取得一組環境變數,此組變數包含要求的後設資料,這是 CGI 規格書 所要求的。

一些警告

top

使用環境變數

CGI 程式

環境變數的主要用途之一,就是要將資訊傳達給 CGI 程式。如上所述,傳遞給 CGI 程式之環境包含標準的請求元資料,以及任何在 Apache 組態中設定的變數。更多詳情,請見CGI 教學

SSI 頁面

經由 mod_includeINCLUDES 篩選器處理的伺服器解析 (SSI) 文件可以使用 echo 元素來列印環境變數,並可在流程控制元素中使用環境變數,令整個頁面的組成取決於請求的特性。Apache 也提供 SSI 頁面標準 CGI 環境變數,如上所述。更多詳情,請見SSI 教學

存取控制

基於環境變數的伺服器存取可以利用 Require envRequire not env 指令做控制。結合 SetEnvIf,這能讓基於用戶端特性的伺服器存取控制更靈活。例如,你可以使用這些指令拒絕特定瀏覽器的存取 (使用者代理)。

條件式記錄

環境變數可以使用 LogFormat 選項 %e 在存取記錄中做記錄。此外,關於是否紀錄請求的決定,可以用 CustomLog 指令的條件式表單,基於環境變數的狀態而做出。結合 SetEnvIf,這讓用於記錄哪些請求的控制更靈活。舉例來說,你可以選擇不記錄檔名以 gif 結尾的請求,或是選擇只記錄來自你子網路外的用戶端請求。

條件式回應標頭

Header 指令可以使用環境變數存在與否來決定是否在對用戶端的回應中放置某個 HTTP 標題。這允許例如僅在請求中從用戶端收到對應標題時才傳送某個回應標題。

外部濾網啟動

mod_ext_filter 使用 ExtFilterDefine 指令設定的外部濾網可以根據環境變數使用 disableenv=enableenv= 選項進行啟動。

URL 轉寫規則

RewriteCond 中的 TestString%{ENV:variable} 形式允許 mod_rewrite 的轉寫引擎根據環境變數進行決定。注意,在沒有 ENV: 前置詞的 mod_rewrite 中存取的變數實際上並非環境變數。相較之下,它們是 mod_rewrite 特有的變數,無法從其他模組存取。

top

特殊目的環境變數

互通性問題導致引入了修改 Apache 在與特定用戶端對話時行為的機制。為了讓這些機制盡可能靈活,它們會透過定義環境變數來呼叫,通常使用 BrowserMatch,儘管例如也可以使用 SetEnvPassEnv

downgrade-1.0

這會強制請求被視為 HTTP/1.0 請求,即使它在後面的方言中也是如此。

force-gzip

如果你啟用了 DEFLATE 濾網,這個環境變數會忽略瀏覽器的接受編碼設定,並無條件傳送壓縮輸出的內容。

force-no-vary

在回應標題傳回給用戶端之前,這會將所有 Vary 欄位從回應標題中移除。有些用戶端未正確解譯這個欄位;設定這個變數可以解決這個問題。設定這個變數也意味著 force-response-1.0

force-response-1.0

這會強制以 HTTP/1.1 請求進行 HTTP/1.0 回應給用戶端。它起初是因為 AOL 代理伺服器問題而實作的。有些 HTTP/1.0 用戶端在給予 HTTP/1.1 回應時可能無法正確行為,而這可以使用來與它們互通。

gzip-only-text/html

當設定為「1」,這個變數會停用 mod_deflate 提供的 DEFLATE 輸出濾鏡,以用於除了 text/html 之外的內容類型。如果您想要使用靜態壓縮的檔案, mod_negotiation 也會評估該變數(不僅針對 gzip,還針對與「identity」不同的所有編碼)。

no-gzip

當設定時, mod_deflateDEFLATE 濾鏡將會關閉,而 mod_negotiation 將會拒絕傳送編碼的資源。

no-cache

可使用於 2.2.12 及更新版本

當設定時, mod_cache 將不會儲存原本可以快取的回應。此環境變數不會影響快取中是否已經儲存的回應是否會提供給目前的請求。

nokeepalive

當設定時,此變數將會停用 KeepAlive

prefer-language

此變數會影響 mod_negotiation 的行為。如果變數包含語言標籤(例如 en、jax-klingon), mod_negotiation 會嘗試傳送具有該語言的變體。如果沒有此類變體,則會套用一般的 協商 程序。

redirect-carefully

此變數會強制伺服器在將重新導向傳送到用戶端時更加小心。此變數通常用於用戶端在處理重新導向時有已知問題的情形。一開始實作此變數的目的是為了解決 Microsoft WebFolders 軟體在使用 DAV 方法處理目錄資源的重新導向時所出現的問題。

suppress-error-charset

可使用於 2.0.54 之後的版本

當 Apache 對用戶端要求發出重新導向時,回應中會包含一些實際的文字,如果用戶端無法(或不會)自動追蹤重新導向,這些文字就會顯示。Apache 通常會根據其所使用的字元集來標記文字,而其字元集是 ISO-8859-1。

但是,如果重新導向到的是使用不同字元集的頁面,有些損壞的瀏覽器版本會嘗試使用重新導向文字中的字元集,而不是實際頁面的字元集。例如,這可能會導致錯誤地呈現希臘文。

設定此環境變數會讓 Apache 省略重新導向文字的字元集,而這些損壞的瀏覽器會正確使用目標頁面的字元集。

安全性注意事項

傳送沒有明確指定字元組的錯誤頁面,可能會允許現有瀏覽器 (MSIE) 進行跨網站指令碼攻擊,而這些瀏覽器不遵循 HTTP/1.1 規格,但會嘗試從內容「猜測」字元組。此類瀏覽器容易被誤導,使用 UTF-7 字元組,且輸入資料 (例如要求 URI) 中的 UTF-7 內容不會被用來防止跨網站指令碼攻擊的正常逃脫機制轉義。

force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked, proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled

這些指令會修改 mod_proxy 的協定行為。請參閱 mod_proxymod_proxy_http 文件,以取得更多詳細資料。

ap_trust_cgilike_cl

在 2.4.59 及更新版本中提供

這個變數允許在類 CGI 模組中執行的指令碼,提供它自己的 Content-Length HTTP 回應標頭。它只應該設定在包含受信任指令碼的組態區段。

top

範例

傳遞損毀標頭到 CGI 指令碼

從版本 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」教學。

可用的語言:  en  |  fr  |  ja  |  ko  |  tr 

top

留言

請注意
這是 Q&A 部分,請不要在此處發布留言,請您對文件或伺服器改進提供建議,否則您的留言將會被我們的管理員刪除。有關如何管理 Apache HTTP 伺服器的問題,請導向 Libera.chat 上的 IRC 頻道 #httpd,或寄送至我們的 郵件列表