<-
Apache HTTP 服务器 2.4 > 环境变量

Apache中的环境变量

有两种环境变量会影响Apache HTTP Server。

首先,存在由底层操作系统控制的环境变量。这些是在服务器启动之前设置的。它们可以在配置文件的扩展中使用,并且可以选择使用PassEnv指令传递给CGI脚本和SSI。

其次,Apache HTTP Server提供了一种将信息存储在命名变量(也称为环境变量)中的机制。此信息可用于控制各种操作,例如日志记录或访问控制。变量还用作与外部程序(例如CGI脚本)进行通信的机制。本文档讨论了操纵和使用这些变量的不同方法。

尽管这些变量称为环境变量,但它们与底层操作系统控制的环境变量不同。而是将这些变量存储在内部Apache结构中并进行操作。仅当将它们提供给CGI脚本和Server Side Include脚本时,它们才成为实际的操作系统环境变量。如果要操纵服务器本身运行的操作系统环境,则必须使用操作系统外壳程序提供的标准环境操纵机制。

支持Apache!

也可以看看

最佳

设置环境变量

基本环境操作

在Apache中设置环境变量的最基本方法是使用无条件SetEnv指令。也可以从使用PassEnv指令启动服务器的外壳环境中传递变量 。

每个请求的条件设置

为了获得更大的灵活性,由mod_setenvif环境变量提供的指令 允许根据特定请求的特性在每个请求的基础上设置环境变量。例如,仅当特定的浏览器(User-Agent)发出请求时才设置变量,或者仅当找到特定的Referer [sic]标头时才可以设置变量。更大的灵活性可通过mod_rewriteRewriteRule,它使用的 [E=...]选项来设置环境变量。

唯一标识符

最后,mod_unique_idUNIQUE_ID每个请求的环境变量设置为一个值,该值在非常特定的条件下保证在“所有”请求中唯一。

标准CGI变量

除了在Apache配置中设置并从外壳传递的所有环境变量之外,CGI脚本和SSI页面还提供了一组环境变量,其中包含CGI规范要求的有关请求的元信息。

一些警告

最佳

使用环境变量

CGI脚本

环境变量的主要用途之一是将信息传达给CGI脚本。如上所述,传递给CGI脚本的环境除了Apache配置中设置的任何变量外,还包括有关请求的标准元信息。有关更多详细信息,请参见 CGI教程

SSI页面

mod_includeINCLUDES过滤器处理的服务器解析(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=选项以环境变量为条件进行激活 。

URL重写

该形式 的TestString在允许的重写引擎做出决定于环境变量的条件。请注意, 没有前缀即可访问的变量实际上不是环境变量。相反,它们是无法从其他模块访问的特殊变量 。%{ENV:variable}RewriteCondmod_rewritemod_rewriteENV:mod_rewrite

最佳

特殊目的环境变量

互操作性问题导致引入了一些机制,以修改与特定客户端通信时Apache的行为方式。为了使这些机制尽可能灵活,可以通过定义环境变量(通常使用)来调用它们,例如BrowserMatchSetEnv并且 PassEnv也可以使用它们。

降级-1.0

这将强制该请求被视为HTTP / 1.0请求,即使该请求位于更高版本的方言中也是如此。

强制gzip

如果您DEFLATE激活了过滤器,则此环境变量将忽略浏览器的接受编码设置,并将无条件发送压缩输出。

强制不变

这将导致Vary在将其发送回客户端之前,将所有字段从响应标头中删除。一些客户不能正确地解释该字段。设置此变量可以解决此问题。设置此变量也意味着force-response-1.0

强制响应1.0

这会强制向发出HTTP / 1.0请求的客户端发出HTTP / 1.0响应。它最初是由于AOL代理出现问题而实施的。给定HTTP / 1.1响应时,某些HTTP / 1.0客户端可能无法正常运行,并且可以用于与它们进行互操作。

gzip-only-text / html

设置为值“ 1”时,此变量将禁用而不为所DEFLATE提供的mod_deflate内容类型 提供的 输出过滤器 text/html。如果您想使用静态压缩的文件,mod_negotiation 则还要评估该变量(不仅针对gzip,而且针对不同于“ identity”的所有编码)。

无gzip

设置后,的DEFLATE过滤器 mod_deflate将关闭, mod_negotiation并拒绝提供编码的资源。

无缓存

在2.2.12和更高版本中可用

设置后,mod_cache将不会保存其他可缓存的响应。此环境变量不会影响是否已为当前请求提供缓存中已存在的响应。

Nokeepalive

KeepAlive 设置时禁用。

偏好语言

这影响了mod_negotiation行为。如果它包含一个语言标签(如enjax-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内容也不会被旨在防止跨站点脚本攻击的常规转义机制所转义。

force-proxy-request-1.0,proxy-nokeepalive,proxy-sendchunked,proxy-sendcl,proxy-chain-auth,proxy-interim-response,proxy-initial-not-pooled

这些指令会更改的协议行为 mod_proxy。有关 更多详细信息,请参见mod_proxymod_proxy_http文档。

最佳

例子

将损坏的标头传递给CGI脚本

从版本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上的“ 防止图像装饰其他站点 ”教程。

可用语言: zh  |  fr  |  ja  |  ko  |  TR 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。