Apache HTTP Server 版本2.2
Apache HTTP服務(wù)器提供了一個機(jī)制,可以把信息存儲在叫做環(huán)境變量(environment variable)的命名變量中。這個信息可以用于控制諸如日志記錄和訪問控制之類的操作。此外,還可以作為一個和諸如CGI腳本這樣的外部程序進(jìn)行溝通的機(jī)制。本文檔討論了操作和使用這些變量的不同方法。
盡管這些變量也被稱作環(huán)境變量,但它們和底層的、由操作系統(tǒng)控制的環(huán)境變量不能混為一談。這些變量僅在Apache內(nèi)部被存儲和操縱。僅當(dāng)它們被提供給外部CGI腳本或服務(wù)器端包含腳本(SSI)時,才會變成真正的操作系統(tǒng)環(huán)境變量。如果你想操作作為服務(wù)器運(yùn)行基礎(chǔ)的操作系統(tǒng)的環(huán)境變量,你必須使用由你的操作系統(tǒng)shell提供的標(biāo)準(zhǔn)環(huán)境操作機(jī)制。
相關(guān)模塊 | 相關(guān)指令 |
---|---|
設(shè)置一個Apache環(huán)境變量最基本的方法,就是使用沒有什么限制的SetEnv
指令。也可以使用PassEnv
指令將啟動Apache的操作系統(tǒng)shell的環(huán)境變量傳進(jìn)來。
為了具有額外的伸縮性,mod_setenvif
提供的指令允許針對每個請求特定的請求特性進(jìn)行環(huán)境變量的設(shè)定。比如,可以僅在一個特定的瀏覽器(User-Agent)進(jìn)行請求時,或僅在一個特定的"Referer:"頭被發(fā)現(xiàn)時進(jìn)行環(huán)境變量的設(shè)置。如果使用mod_rewrite
的RewriteRule
指令中的 [E=...]
選項來進(jìn)行環(huán)境變量的設(shè)置,還會具有更大伸縮性。
最后,mod_unique_id
將為每個請求設(shè)定一個UNIQUE_ID
環(huán)境變量的值,這個值對"所有"請求都是唯一的,即使在極為特定的條件下。
除了所有Apache配置中的環(huán)境變量和由操作系統(tǒng)shell傳進(jìn)來的環(huán)境變量之外,還有一組環(huán)境變量是提供給CGI腳本和SSI頁面的,此組環(huán)境變量包含由CGI規(guī)范要求的與請求相關(guān)的元信息。
suexec
來運(yùn)行CGI腳本時,環(huán)境變量將會被清除到在CGI腳本運(yùn)行之前只剩一組安全變量。安全變量的列表在編譯時由suexec.c定義。相關(guān)模塊 | 相關(guān)指令 |
---|---|
環(huán)境變量的主要用途之一就是把信息傳遞給CGI腳本。如前所述,遞給CGI腳本的環(huán)境變量,除了在Apache配置中定義的以外,還包含一組與請求相關(guān)的標(biāo)準(zhǔn)元信息的環(huán)境變量。更多細(xì)節(jié)請參見CGI教程。
由mod_include的INCLUDES
過濾器處理的服務(wù)器端解析(Server-parsed[SSI])文檔能夠用echo
元素打印出環(huán)境變量,并能在流程控制元素中使用環(huán)境變量來基于請求特性而產(chǎn)生部分頁面。Apache當(dāng)然也會將上述的標(biāo)準(zhǔn)CGI環(huán)境變量提供給SSI頁面。更多細(xì)節(jié)請參見SSI教程。
可以用 allow from env=
和 deny from env=
指令基于環(huán)境變量的值對服務(wù)器進(jìn)行訪問控制。在結(jié)合了SetEnvIf
之后,能更靈活的基于客戶端特性對服務(wù)器進(jìn)行訪問控制。比如,你能用這些指令來拒絕一些特定瀏覽器(User-Agent)的訪問。
可以用LogFormat
的可選項"%e
"將環(huán)境變量寫入訪問日志中。此外,還可以用CustomLog
指令基于環(huán)境變量的狀態(tài)來決定是否將請求寫入日志。在結(jié)合了SetEnvIf
之后,能更靈活的控制哪些請求將被記錄。比如,你可以選擇不對以gif
為結(jié)尾的文件名請求進(jìn)行記錄,或者選擇只記錄內(nèi)網(wǎng)之外的客戶端請求。
Header
指令能根據(jù)一個環(huán)境變量是否存在來決定是否將一個HTTP頭放入對客戶端的響應(yīng)里。這將使諸如從客戶端收到特定的請求頭時返回特定的應(yīng)答頭這樣的事情成為可能。
由mod_ext_filter
的ExtFilterDefine
指令配置的外部過濾器可以用 disableenv=
和 enableenv=
選項根據(jù)環(huán)境變量的條件進(jìn)行激活。
RewriteCond
中形如 %{ENV:...}
的TestString允許mod_rewrite的重寫引擎以環(huán)境變量為條件進(jìn)行決策。注意:mod_rewrite內(nèi)部可以訪問但沒有以 ENV:
開頭的那些變量并不是真正的環(huán)境變量。它們只是mod_rewrite特有的變量而不能被其他模塊所訪問。
由于互操作性的問題,在針對特定客戶端的處理中,引入了一套修正Apache行為的機(jī)制。為了使這些機(jī)制盡量靈活,它們將通過環(huán)境變量的定義而激活。比如,典型的示例有BrowserMatch
,盡管SetEnv
和PassEnv
也能使用。
即使這個請求符合更新的標(biāo)準(zhǔn),也強(qiáng)制把它當(dāng)作一個HTTP/1.0請求來處理。
如果你激活了DEFLATE
過濾器,這個環(huán)境變量將忽略瀏覽器的accept-encoding設(shè)置而無條件的使用經(jīng)過gzip壓縮的輸出。
此變量在將應(yīng)答送回客戶端之前刪除所有的Vary
頭字段。一些客戶端不能正確地解析此頭字段。此變量的設(shè)定將解決此問題,它同時隱含設(shè)置了force-response-1.0。
設(shè)定該變量可以在客戶端發(fā)送HTTP/1.0請求時,強(qiáng)制進(jìn)行HTTP/1.0響應(yīng)。它的實現(xiàn)源于一個AOL的代理產(chǎn)生的問題。一些HTTP/1.0客戶端在收到HTTP/1.1的響應(yīng)后會有不正常的舉動。而設(shè)定此變量能夠解決這一問題。
當(dāng)該變量為"1"時,將禁止text/html
之外的內(nèi)容類型使用由mod_deflate
提供的DEFLATE
輸出過濾器。如果你更喜歡使用靜態(tài)的壓縮文件;mod_negotiation
也同樣使用該變量(不單單是gzip,而是所有不具有"同一性"的編碼)。
如果設(shè)置了此變量,mod_deflate
中的DEFLATE
過濾器將被禁用,同時mod_negotiation
將拒絕發(fā)送經(jīng)過編碼的資源。
如果設(shè)置了此變量,KeepAlive
將被禁用。
此變量將影響mod_negotiation
的行為。如果它包含一個語言標(biāo)簽(如:en
、fr
、zh_cn
、x-方言
),mod_negotiation
將嘗試發(fā)送一個標(biāo)簽指定的語言的變種,如果不存在這樣的變種,則使用通常的內(nèi)容協(xié)商處理過程。
此變量將使服務(wù)器在對客戶端發(fā)送重定向命令時更加小心。典型應(yīng)用于已知客戶端在處理重定向指令時會存在問題的情況下。它的實現(xiàn)源于微軟的WebFolders軟件存在的一個問題。它在經(jīng)由DAV方法在目錄資源上處理重定向命令時會有問題。
僅存在于2.0.54后的版本中
當(dāng)Apache針對用戶請求響應(yīng)一個重定向命令的時候,這個響應(yīng)中包含了一些文字。這些文字將在客戶端不能(或沒有)自動執(zhí)行重定向操作的情況下顯示。Apache會將這段文字按照ISO-8859-1字符集進(jìn)行編碼。
然而,如果重定向的目的頁面使用了不同的字符集,一些有問題的瀏覽器版本會使用重定向命令文本的字符集,而不是采用目的頁面的字符集。比如,希臘文就不會被正確顯示。
設(shè)置此環(huán)境變量將使Apache略過重定向命令文本的字符集設(shè)置,這樣這些有問題的瀏覽器就會正確的使用目的頁的字符集。
早期的版本建議將以下示例包含到httpd.conf中以解決一些已知的客戶端問題。但是這些存在問題的客戶端現(xiàn)在基本上已經(jīng)絕種了,所以,下列示例也就沒有存在的必要了。
# 下面的指令將會修改HTTP的普通響應(yīng)方式。 # 第一個指令為Netscape 2.x瀏覽器禁用keepalive特性,因為它不能正確處理。 # 第二個指令用于IE4.0,因為它也不能對HTTP/1.1的301/302(重定向)應(yīng)答正確處理keepalive。 BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 # 下面的指令為違反HTTP/1.0規(guī)范的瀏覽器禁用HTTP/1.1應(yīng)答。 BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0
以下示例將避免將對圖片的請求記入訪問日志中。你修改一下就可以將它用于避免特定目錄或特定主機(jī)的請求被記入日志。
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
下例展示了如何避免不在你服務(wù)器上的人在他們的站點中直接引用你服務(wù)器上的圖片。這不是一個推薦的配置,但它能在有限的環(huán)境中加以應(yīng)用。我們假設(shè)你所有的圖片都在/web/images目錄下。
SetEnvIf Referer "^http://www.example.com/" local_referal # 允許未發(fā)送Referer頭的瀏覽器 SetEnvIf Referer "^$" local_referal <Directory /web/images> Order Deny,Allow Deny from all Allow from env=local_referal </Directory>
想得知此技術(shù)的更多信息,請參閱"今日Apache教程" 《保護(hù)你的圖片不為他人所用》。