# 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
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航