# Apache的環境變量
Apache HTTP服務器提供了一個機制,可以把信息存儲在叫做_環境變量_(environment variable)的命名變量中。這個信息可以用于控制諸如日志記錄和訪問控制之類的操作。此外,還可以作為一個和諸如CGI腳本這樣的外部程序進行溝通的機制。本文檔討論了操作和使用這些變量的不同方法。
盡管這些變量也被稱作_環境變量_,但它們和底層的、由操作系統控制的環境變量不能混為一談。這些變量僅在Apache內部被存儲和操縱。僅當它們被提供給外部CGI腳本或服務器端包含腳本(SSI)時,才會變成真正的操作系統環境變量。如果你想操作作為服務器運行基礎的操作系統的環境變量,你必須使用由你的操作系統shell提供的標準環境操作機制。
## 設置環境變量
相關模塊
* `mod_env`
* `mod_rewrite`
* `mod_setenvif`
* `mod_unique_id`
相關指令
* `BrowserMatch`
* `BrowserMatchNoCase`
* `PassEnv`
* `RewriteRule`
* `SetEnv`
* `SetEnvIf`
* `SetEnvIfNoCase`
* `UnsetEnv`
### 基本的環境變量操作
設置一個Apache環境變量最基本的方法,就是使用沒有什么限制的`SetEnv`指令。也可以使用`PassEnv`指令將啟動Apache的操作系統shell的環境變量傳進來。
### 針對每個請求進行有條件的設定
為了具有額外的伸縮性,`mod_setenvif` 提供的指令允許針對每個請求特定的請求特性進行環境變量的設定。比如,可以僅在一個特定的瀏覽器(User-Agent)進行請求時,或僅在一個特定的"Referer:"頭被發現時進行環境變量的設置。如果使用`mod_rewrite`的`RewriteRule`指令中的 `[E=...]` 選項來進行環境變量的設置,還會具有更大伸縮性。
### 唯一標識符
最后,`mod_unique_id`將為每個請求設定一個`UNIQUE_ID`環境變量的值,這個值對"所有"請求都是唯一的,即使在極為特定的條件下。
### 標準CGI變量
除了所有Apache配置中的環境變量和由操作系統shell傳進來的環境變量之外,還有一組環境變量是提供給CGI腳本和SSI頁面的,此組環境變量包含由[CGI規范](http://cgi-spec.golux.com/)要求的與請求相關的元信息。
### 一些告誡
* 用環境變量操作指令來覆蓋或修改標準的CGI變量是行不通的。
* 當用`suexec`來運行CGI腳本時,環境變量將會被清除到在CGI腳本運行之前只剩一組_安全_變量。_安全_變量的列表在編譯時由suexec.c定義。
* 出于可移植性的考慮,環境變量的命名必須僅包含字母、數字、下劃線。此外,第一個符號不能為數字。不符合此要求的字符將在傳遞給CGI腳本和SSI頁面時被下劃線取代。
## 使用環境變量
相關模塊
* `mod_authz_host`
* `mod_cgi`
* `mod_ext_filter`
* `mod_headers`
* `mod_include`
* `mod_log_config`
* `mod_rewrite`
相關指令
* `Allow`
* `CustomLog`
* `Deny`
* `ExtFilterDefine`
* `Header`
* `LogFormat`
* `RewriteCond`
* `RewriteRule`
### CGI腳本
環境變量的主要用途之一就是把信息傳遞給CGI腳本。如前所述,遞給CGI腳本的環境變量,除了在Apache配置中定義的以外,還包含一組與請求相關的標準元信息的環境變量。更多細節請參見[CGI教程](#calibre_link-215)。
### SSI頁面
由mod_include的`INCLUDES`過濾器處理的服務器端解析(Server-parsed[SSI])文檔能夠用`echo`元素打印出環境變量,并能在流程控制元素中使用環境變量來基于請求特性而產生部分頁面。Apache當然也會將上述的標準CGI環境變量提供給SSI頁面。更多細節請參見[SSI教程](#calibre_link-267)。
### 訪問控制
可以用 `allow from env=` 和 `deny from env=` 指令基于環境變量的值對服務器進行訪問控制。在結合了`SetEnvIf`之后,能更靈活的基于客戶端特性對服務器進行訪問控制。比如,你能用這些指令來拒絕一些特定瀏覽器(User-Agent)的訪問。
### 條件日志記錄
可以用`LogFormat`的可選項"`%e`"將環境變量寫入訪問日志中。此外,還可以用`CustomLog`指令基于環境變量的狀態來決定是否將請求寫入日志。在結合了`SetEnvIf`之后,能更靈活的控制哪些請求將被記錄。比如,你可以選擇不對以`gif`為結尾的文件名請求進行記錄,或者選擇只記錄內網之外的客戶端請求。
### 條件響應頭
`Header`指令能根據一個環境變量是否存在來決定是否將一個HTTP頭放入對客戶端的響應里。這將使諸如從客戶端收到特定的請求頭時返回特定的應答頭這樣的事情成為可能。
### 外部過濾器的激活
由`mod_ext_filter`的`ExtFilterDefine`指令配置的外部過濾器可以用 `disableenv=` 和 `enableenv=` 選項根據環境變量的條件進行激活。
### URL重寫
`RewriteCond`中形如 `%{ENV:...}` 的_TestString_允許mod_rewrite的重寫引擎以環境變量為條件進行決策。注意:mod_rewrite內部可以訪問但沒有以 `ENV:` 開頭的那些變量并不是真正的環境變量。它們只是mod_rewrite特有的變量而不能被其他模塊所訪問。
## 用于特殊目的的環境變量
由于互操作性的問題,在針對特定客戶端的處理中,引入了一套修正Apache行為的機制。為了使這些機制盡量靈活,它們將通過環境變量的定義而激活。比如,典型的示例有`BrowserMatch` ,盡管`SetEnv`和`PassEnv`也能使用。
### downgrade-1.0
即使這個請求符合更新的標準,也強制把它當作一個HTTP/1.0請求來處理。
### force-gzip
如果你激活了`DEFLATE`過濾器,這個環境變量將忽略瀏覽器的accept-encoding設置而無條件的使用經過gzip壓縮的輸出。
### force-no-vary
此變量在將應答送回客戶端之前刪除所有的`Vary`頭字段。一些客戶端不能正確地解析此頭字段。此變量的設定將解決此問題,它同時隱含設置了**force-response-1.0**。
### force-response-1.0
設定該變量可以在客戶端發送HTTP/1.0請求時,強制進行HTTP/1.0響應。它的實現源于一個AOL的代理產生的問題。一些HTTP/1.0客戶端在收到HTTP/1.1的響應后會有不正常的舉動。而設定此變量能夠解決這一問題。
### gzip-only-text/html
當該變量為"1"時,將禁止`text/html`之外的內容類型使用由`mod_deflate`提供的`DEFLATE`輸出過濾器。如果你更喜歡使用靜態的壓縮文件;`mod_negotiation`也同樣使用該變量(不單單是gzip,而是所有不具有"同一性"的編碼)。
### no-gzip
如果設置了此變量,`mod_deflate`中的`DEFLATE`過濾器將被禁用,同時`mod_negotiation`將拒絕發送經過編碼的資源。
### nokeepalive
如果設置了此變量,`KeepAlive`將被禁用。
### prefer-language
此變量將影響`mod_negotiation`的行為。如果它包含一個語言標簽(如:`en`、`fr`、`zh_cn`、`x-方言`),`mod_negotiation`將嘗試發送一個標簽指定的語言的變種,如果不存在這樣的變種,則使用通常的[內容協商](#calibre_link-258)處理過程。
### redirect-carefully
此變量將使服務器在對客戶端發送重定向命令時更加小心。典型應用于已知客戶端在處理重定向指令時會存在問題的情況下。它的實現源于微軟的WebFolders軟件存在的一個問題。它在經由DAV方法在目錄資源上處理重定向命令時會有問題。
### suppress-error-charset
_僅存在于2.0.54后的版本中_
當Apache針對用戶請求響應一個重定向命令的時候,這個響應中包含了一些文字。這些文字將在客戶端不能(或沒有)自動執行重定向操作的情況下顯示。Apache會將這段文字按照ISO-8859-1字符集進行編碼。
然而,如果重定向的目的頁面使用了不同的字符集,一些有問題的瀏覽器版本會使用重定向命令文本的字符集,而不是采用目的頁面的字符集。比如,希臘文就不會被正確顯示。
設置此環境變量將使Apache略過重定向命令文本的字符集設置,這樣這些有問題的瀏覽器就會正確的使用目的頁的字符集。
### force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked, proxy-sendcl
這些指令改變了`mod_proxy`協議的行為,參見`mod_proxy`文檔以獲得更多細節。
## 示例
### 針對表現不恰當的客戶端改變協議的行為
早期的版本建議將以下示例包含到httpd.conf中以解決一些已知的客戶端問題。但是這些存在問題的客戶端現在基本上已經絕種了,所以,下列示例也就沒有存在的必要了。
```
# 下面的指令將會修改HTTP的普通響應方式。
# 第一個指令為Netscape 2.x瀏覽器禁用keepalive特性,因為它不能正確處理。
# 第二個指令用于IE4.0,因為它也不能對HTTP/1.1的301/302(重定向)應答正確處理keepalive。
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
# 下面的指令為違反HTTP/1.0規范的瀏覽器禁用HTTP/1.1應答。
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
# 允許未發送Referer頭的瀏覽器
SetEnvIf Referer "^$" local_referal
<Directory /web/images>
Order Deny,Allow
Deny from all
Allow from env=local_referal
</Directory>
```
想得知此技術的更多信息,請參閱"今日Apache教程" [《保護你的圖片不為他人所用》](http://apachetoday.com/news_story.php3?ltsn=2000-06-14-002-01-PS)。
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航