• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • Apache中的环境变量

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

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

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

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

    设置环境变量

    相关模块相关指令
    • mod_cache
    • mod_env
    • mod_rewrite
    • mod_setenvif
    • mod_unique_id
    • BrowserMatch
    • BrowserMatchNoCase
    • PassEnv
    • RewriteRule
    • SetEnv
    • SetEnvIf
    • SetEnvIfNoCase
    • UnsetEnv

    基本环境操作

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

    每个请求的条件设置

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

    唯一标识符

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

    标准CGI变量

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

    一些警告

    • 使用环境操作指令无法覆盖或更改标准CGI变量。
    • suexec用于启动CGI脚本时,将在启动CGI脚本之前将环境清理为一组安全变量。安全变量列表是在编译时在中定义的suexec.c
    • 出于可移植性原因,环境变量的名称只能包含字母,数字和下划线字符。此外,第一个字符可能不是数字。传递给CGI脚本和SSI页面时,不符合此限制的字符将由下划线替换。
    • HTTP头是一个特例,它通过环境变量传递到CGI脚本等(见下文)。它们被转换为大写,只有破折号被下划线代替;如果标头包含任何其他(无效)字符,则整个标头将被静默删除。解决方法请参见下文。
    • SetEnv伪指令在请求处理期间运行较晚,这意味着诸如SetEnvIf和的伪指令RewriteCond将看不到使用它设置的变量。
    • 当服务器通过内部子请求(例如查找DirectoryIndex或使用生成目录列表)查找路径时,子mod_autoindex请求中不会继承每个请求的环境变量。此外,SetEnvIf由于API阶段mod_setenvif会采取行动,因此不会在子请求中单独评估指令。

    使用环境变量

    相关模块相关指令
    • mod_authz_host
    • mod_cgi
    • mod_ext_filter
    • mod_headers
    • mod_include
    • mod_log_config
    • mod_rewrite
    • Require
    • CustomLog
    • Deny
    • ExtFilterDefine
    • Header
    • LogFormat
    • RewriteCond
    • RewriteRule

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