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