有两种环境变量会影响Apache HTTP Server。
首先,存在由底层操作系统控制的环境变量。这些是在服务器启动之前设置的。它们可以在配置文件的扩展中使用,并且可以选择使用PassEnv指令传递给CGI脚本和SSI。
其次,Apache HTTP Server提供了一种将信息存储在命名变量(也称为环境变量)中的机制。此信息可用于控制各种操作,例如日志记录或访问控制。变量还用作与外部程序(例如CGI脚本)进行通信的机制。本文档讨论了操纵和使用这些变量的不同方法。
尽管这些变量称为环境变量,但它们与底层操作系统控制的环境变量不同。而是将这些变量存储在内部Apache结构中并进行操作。仅当将它们提供给CGI脚本和Server Side Include脚本时,它们才成为实际的操作系统环境变量。如果要操纵服务器本身运行的操作系统环境,则必须使用操作系统外壳程序提供的标准环境操纵机制。
相关模块 | 相关指令 |
---|---|
在Apache中设置环境变量的最基本方法是使用无条件SetEnv
指令。也可以从使用PassEnv
指令启动服务器的外壳环境中传递变量
。
为了获得更大的灵活性,由mod_setenvif
环境变量提供的指令
允许根据特定请求的特性在每个请求的基础上设置环境变量。例如,仅当特定的浏览器(User-Agent)发出请求时才设置变量,或者仅当找到特定的Referer [sic]标头时才可以设置变量。更大的灵活性可通过mod_rewrite
的RewriteRule
,它使用的
[E=...]
选项来设置环境变量。
最后,mod_unique_id
将UNIQUE_ID
每个请求的环境变量设置为一个值,该值在非常特定的条件下保证在“所有”请求中唯一。
除了在Apache配置中设置并从外壳传递的所有环境变量之外,CGI脚本和SSI页面还提供了一组环境变量,其中包含CGI规范要求的有关请求的元信息。
suexec
用于启动CGI脚本时,将在启动CGI脚本之前将环境清理为一组
安全变量。安全变量列表是在编译时定义的
suexec.c
。SetEnv
伪指令在请求处理期间运行较晚,这意味着诸如SetEnvIf
和的伪指令
RewriteCond
将不会看到使用它设置的变量。DirectoryIndex
或使用生成目录列表)查找路径时,
子mod_autoindex
请求中不会继承每个请求的环境变量。此外,SetEnvIf
由于API阶段mod_setenvif
会采取行动,
因此不会在子请求中单独评估指令
。相关模块 | 相关指令 |
---|---|
环境变量的主要用途之一是将信息传达给CGI脚本。如上所述,传递给CGI脚本的环境除了Apache配置中设置的任何变量外,还包括有关请求的标准元信息。有关更多详细信息,请参见 CGI教程。
mod_include
的
INCLUDES
过滤器处理的服务器解析(SSI)文档
可以使用echo
元素打印环境变量,并且可以在流控制元素中使用环境变量,以使页面的某些部分取决于请求的特征。Apache还为SSI页面提供了如上所述的标准CGI环境变量。有关更多详细信息,请参见SSI教程。
可以使用allow from env=
和deny from env=
指令基于环境变量的值来控制对服务器的访问。与结合使用
SetEnvIf
,可以根据客户端的特性灵活控制对服务器的访问。例如,您可以使用这些指令来拒绝对特定浏览器(User-Agent)的访问。
可以使用LogFormat
选项将环境变量记录在访问日志中%e
。另外,可以使用CustomLog
指令的条件形式根据环境变量的状态来决定是否记录请求
。与SetEnvIf
此结合可以灵活地控制记录哪些请求。例如,您可以选择不记录以结尾的文件名的请求gif
,或者可以选择仅记录来自子网外的客户端的请求。
该Header
指令可以使用是否存在环境变量来确定是否将某些HTTP标头放置在对客户端的响应中。例如,这仅在从客户端请求中接收到相应的标头时才发送特定的响应标头。
通过mod_ext_filter
使用ExtFilterDefine
伪指令配置的外部过滤器,可以使用disableenv=
和enableenv=
选项以环境变量为条件进行激活
。
该形式
的TestString在允许的重写引擎做出决定于环境变量的条件。请注意,
没有前缀即可访问的变量实际上不是环境变量。相反,它们是无法从其他模块访问的特殊变量
。%{ENV:variable}
RewriteCond
mod_rewrite
mod_rewrite
ENV:
mod_rewrite
互操作性问题导致引入了一些机制,以修改与特定客户端通信时Apache的行为方式。为了使这些机制尽可能灵活,可以通过定义环境变量(通常使用)来调用它们,例如BrowserMatch
,SetEnv
并且 PassEnv
也可以使用它们。
这将强制该请求被视为HTTP / 1.0请求,即使该请求位于更高版本的方言中也是如此。
如果您DEFLATE
激活了过滤器,则此环境变量将忽略浏览器的接受编码设置,并将无条件发送压缩输出。
这将导致Vary
在将其发送回客户端之前,将所有字段从响应标头中删除。一些客户不能正确地解释该字段。设置此变量可以解决此问题。设置此变量也意味着force-response-1.0。
这会强制向发出HTTP / 1.0请求的客户端发出HTTP / 1.0响应。它最初是由于AOL代理出现问题而实施的。给定HTTP / 1.1响应时,某些HTTP / 1.0客户端可能无法正常运行,并且可以用于与它们进行互操作。
设置为值“ 1”时,此变量将禁用而不为所DEFLATE
提供的mod_deflate
内容类型
提供的
输出过滤器
text/html
。如果您想使用静态压缩的文件,mod_negotiation
则还要评估该变量(不仅针对gzip,而且针对不同于“ identity”的所有编码)。
设置后,的DEFLATE
过滤器
mod_deflate
将关闭,
mod_negotiation
并拒绝提供编码的资源。
在2.2.12和更高版本中可用
设置后,mod_cache
将不会保存其他可缓存的响应。此环境变量不会影响是否已为当前请求提供缓存中已存在的响应。
KeepAlive
设置时禁用。
这影响了mod_negotiation
行为。如果它包含一个语言标签(如en
,ja
或x-klingon
),mod_negotiation
试图与该语言提供的变体。如果没有此类变体,则适用正常的协商过程。
这将迫使服务器在向客户端发送重定向时更加谨慎。通常在客户端具有处理重定向的已知问题时使用。这最初是由于Microsoft的WebFolders软件出现问题而实现的,该软件在通过DAV方法处理目录资源的重定向方面存在问题。
在2.0.54之后的版本中可用
当Apache响应客户端请求发出重定向时,响应中将包含一些实际显示的文本,以防客户端无法(或不自动)遵循重定向。Apache通常根据其使用的字符集(ISO-8859-1)来标记此文本。
但是,如果重定向到使用不同字符集的页面,则某些损坏的浏览器版本将尝试使用重定向文本中的字符集,而不是实际页面。例如,这可能会导致希腊语渲染错误。
设置此环境变量会使Apache忽略重定向文本的字符集,然后这些损坏的浏览器将正确使用目标页面的字符集。
发送没有指定字符集的错误页面可能会导致不遵循HTTP / 1.1规范并尝试从内容中“猜测”字符集的现有浏览器(MSIE)进行跨站点脚本攻击。这样的浏览器很容易被愚弄,使用UTF-7字符集,而输入数据(例如request-URI)中的UTF-7内容也不会被旨在防止跨站点脚本攻击的常规转义机制所转义。
这些指令会更改的协议行为
mod_proxy
。有关
更多详细信息,请参见mod_proxy
和mod_proxy_http
文档。
从版本2.4开始,Apache在如何将HTTP标头转换为环境变量mod_cgi
以及其他模块方面更加严格:以前,标头名称中的所有无效字符都被简单地转换为下划线。这允许通过标头注入进行一些潜在的跨站点脚本攻击(请参阅
异常Web Bug,幻灯片19/20)。
如果您必须支持发送不完整标头且无法修复的客户端,则可以使用一种简单的解决方法mod_setenvif
,mod_headers
使您仍然可以接受这些标头:
# # The following works around a client sending a broken Accept_Encoding # header. # SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
早期版本建议在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 understand 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"> Require env local_referal </Directory>
有关此技术的更多信息,请参见ServerWatch上的“ 防止图像装饰其他站点 ”教程。