Apache HTTP服务器 2.0版本
Apache HTTP服务器提供了一个机制, 可以把信息存储在叫做环境变量的命名变量中。 这个信息将用于进行日志记录和访问控制之类的控制操作。 此外,还会作为一个和诸如CGI脚本这样的外部程序进行沟通的机制。 本文档讨论了操作和使用这些变量的不同方法。
尽管这些变量也被称作环境变量, 但它们和底层由操作系统控制的环境变量不能混为一谈。 这些变量仅在Apache内部被存储和操纵。 它们仅当被提供给外部CGI脚本和服务器端包含脚本时, 才会变成真正的操作系统环境变量。 如果你想操作作为服务器运行基础的操作系统的环境变量, 你必须使用由你的操作系统外壳提供的标准环境操作机制。
相关模块 | 相关指令 |
---|---|
设定Apache下环境变量的一个最普通方法,
就是使用没有什么限制的SetEnv
指令。
也可以用PassEnv
指令将启动服务器的操作系统外壳的环境变量传进来。
为了具有额外的缩扩性,mod_setenvif提供的指令允许针对每个请求,
对特殊请求的特性进行环境变量的设定。比如,
可以仅在一个特定的浏览器(User-Agent)进行请求时,
或仅在一个特定的提交头[sic]被发现时进行环境变量的设置。
如果使用了mod_rewrite的RewriteRule
指令中[E=...]
可选项来进行环境变量的设置,还会更具有缩扩性。
最后,mod_unique_id将为每个请求设定环境变量UNIQUE_ID
为一个值,
这个值对"所有"请求都是唯一的,即使在极为特定的条件下。
在所有Apache配置中的环境变量和由操作系统外壳传来的环境变量之外, 还有一组环境变量用以提供CGI脚本和SSI页面。此套变量包含由CGI规范要求的请求的元信息。
suexec.c
中进行了定义。相关模块 | 相关指令 |
---|---|
环境变量的最主要用途之一就是把信息传递给CGI脚本。如上所述, 在Apache配置中环境变量以外,还有一组包含请求相关的标准元信息的环境变量传给了CGI脚本。 更多细节请参见CGI教程。
由mod_include的INCLUDES
过滤器处理的服务器端解析(SSI)文档能够用
echo
元素打印出环境变量,
并能在流向控制元素中用环境变量来对应请求的特性而产生部分页面。
Apache当然也会将上述的标准CGI环境变量提供给SSI页面。
更多细节请参见SSI教程。
可以用allow from env=
指令和deny from env=
指令
来进行基于环境变量值的服务器的访问控制。
在结合了SetEnvIf
之后,
更能将灵活控制服务器的访问使其能够基于客户端的特性。
比如,你能用这些指令来拒绝一些特定浏览器(User-Agent)的访问。
环境变量能用LogFormat
的可选项%e
记入访问日志里。
此外,可以用CustomLog
指令的条件形式基于环境变量的状态来决定是否将请求记入日志。
在结合了SetEnvIf
之后,
更能灵活的控制哪些请求将被记录。
比如,你可以选择不对以gif为结尾的文件名请求进行记录,
或者选择只记录内网之外的客户端的请求。
Header
指令
能用一个环境变量的存在与否来决定是否将一个HTTP头放入对客户端的回应里。
这将使诸如从客户端收到特定请求头时回复以相应的头这样的事情成为可能。
用mod_ext_filter
的ExtFilterDefine
指令
配置的外部过滤器可以用disableenv=
和enableenv=
选项
根据环境变量的条件进行激活。
RewriteCond
中形似%{ENV:...}
的测试字串允许mod_rewrite的重写引擎以环境变量为条件进行决定。
请注意:mod_rewrite内那些可以访问但没有ENV:
开头的变量并不是真正的环境变量。
它们只是mod_rewrite特定的变量而不能为其他模块访问。
在针对特定客户端的处理中,因为互用性的问题,产生了一套修正Apache行为的机制。
为了使这些机制尽量的灵活,它们将会因为环境变量而激活。
比如,典型的示例有BrowserMatch
,
尽管SetEnv
和PassEnv
也能用。
它将强制把请求当作一个HTTP/1.0的请求来处理,不管这个请求是不是符合更新的标准。
此变量将在送回到客户端之前删除所有的Vary
字段。
一些客户端不能正确地解析此字段。
(参见已知的客户端问题页面);
此变量的设定将解决此问题,同时隐含了force-response-1.0。
此变量设定后将强制进行HTTP/1.0的回应。它的实现源于一个AOL的代理产生的问题。 一些客户端在收到HTTP/1.1的回应后会有不正常的举动。而此变量能够解决这一问题。
当此变量的值被设为“1”,这个变量将禁用text/html
之外的内容类型使用由mod_deflate
提供的压缩输出过滤器。
如果设置了此变量,
mod_deflate
中的DEFLATE
过滤器将被禁用。
如果设置了此变量,KeepAlive
将被禁用。
此变量将使服务器在对客户端发送重定向命令时更加小心。 典型应用于已知客户端处理重定向指令存在问题时。 它的实现源于微软的WebFolders软件存在的一个问题。 它在经由DAV方法在目录资源上处理重定向命令时会有问题。
存在于2.0.40后的版本中
当Apache针对用户请求回应了一个重定向命令的时候,这个回应中包含了一些文字。 这些文字将在客户端不能(或没有)自动执行重定向操作的情况下显示。 Apache会将这段文字按照它所使用的字符集进行编排,一般来说是ISO-8859-1。
然而,如果重定向的目的页面使用了不同的字符集, 一些有问题的浏览器版本会使用重定向命令文本的字符集,而不是采用目的页面的。 比如,希腊文就不会被正确的显示。
此环境变量的设定将使Apache忽略重定向命令文本的字符集设置, 那么这些有问题的浏览器就会正确的使用目的页的字符集。
我们建议将以下示例包含到你的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 grok 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> Order Deny,Allow Deny from all Allow from env=local_referal </Directory>
想得知此技术的更多信息,请参阅“今日Apache教程”的 《保护你的图片不为人所用》。