> Apache2.2 中文手册 > Apache的环境变量

Apache的环境变量

Apache HTTP服务器提供了一个机制,可以把信息存储在叫做环境变量(environment variable)的命名变量中。这个信息可以用于控制诸如日志记录和访问控制之类的操作。此外,还可以作为一个和诸如CGI脚本这样的外部程序进行沟通的机制。本文档讨论了操作和使用这些变量的不同方法。

尽管这些变量也被称作环境变量,但它们和底层的、由操作系统控制的环境变量不能混为一谈。这些变量仅在Apache内部被存储和操纵。仅当它们被提供给外部CGI脚本或服务器端包含脚本(SSI)时,才会变成真正的操作系统环境变量。如果你想操作作为服务器运行基础的操作系统的环境变量,你必须使用由你的操作系统shell提供的标准环境操作机制。

Apache的环境变量

mod_env
  • mod_rewrite
  • mod_setenvif
  • mod_unique_id
  • 基本的环境变量操作

    设置一个Apache环境变量最基本的方法,就是使用没有什么限制的SetEnv指令。也可以使用PassEnv指令将启动Apache的操作系统shell的环境变量传进来。

    针对每个请求进行有条件的设定

    为了具有额外的伸缩性,mod_setenvif 提供的指令允许针对每个请求特定的请求特性进行环境变量的设定。比如,可以仅在一个特定的浏览器(User-Agent)进行请求时,或仅在一个特定的"Referer:"头被发现时进行环境变量的设置。如果使用mod_rewriteRewriteRule指令中的 [E=...] 选项来进行环境变量的设置,还会具有更大伸缩性。

    CGI规范要求的与请求相关的元信息。

    suexec来运行CGI脚本时,环境变量将会被清除到在CGI脚本运行之前只剩一组安全变量。安全变量的列表在编译时由suexec.c定义。
  • 出于可移植性的考虑,环境变量的命名必须仅包含字母、数字、下划线。此外,第一个符号不能为数字。不符合此要求的字符将在传递给CGI脚本和SSI页面时被下划线取代。
  • 由于SetEnv指令在请求处理的后期才运行,所以诸如SetEnvIfRewriteCond之类的指令将看不到SetEnv指令设置的变量。
  • Apache的环境变量

    mod_authz_host
  • mod_cgi
  • mod_ext_filter
  • mod_headers
  • mod_include
  • mod_log_config
  • mod_rewrite
  • CGI教程

    SSI教程

    访问控制

    可以用 allow from env=deny from env= 指令基于环境变量的值对服务器进行访问控制。在结合了SetEnvIf之后,能更灵活的基于客户端特性对服务器进行访问控制。比如,你能用这些指令来拒绝一些特定浏览器(User-Agent)的访问。

    条件日志记录

    可以用LogFormat的可选项"%e"将环境变量写入访问日志中。此外,还可以用CustomLog指令基于环境变量的状态来决定是否将请求写入日志。在结合了SetEnvIf之后,能更灵活的控制哪些请求将被记录。比如,你可以选择不对以gif为结尾的文件名请求进行记录,或者选择只记录内网之外的客户端请求。

    条件响应头

    Header指令能根据一个环境变量是否存在来决定是否将一个HTTP头放入对客户端的响应里。这将使诸如从客户端收到特定的请求头时返回特定的应答头这样的事情成为可能。

    外部过滤器的激活

    mod_ext_filterExtFilterDefine指令配置的外部过滤器可以用 disableenv=enableenv= 选项根据环境变量的条件进行激活。

    URL重写

    RewriteCond中形如 %{ENV:...}TestString允许mod_rewrite的重写引擎以环境变量为条件进行决策。注意:mod_rewrite内部可以访问但没有以 ENV: 开头的那些变量并不是真正的环境变量。它们只是mod_rewrite特有的变量而不能被其他模块所访问。

    Apache的环境变量

    用于特殊目的的环境变量

    由于互操作性的问题,在针对特定客户端的处理中,引入了一套修正Apache行为的机制。为了使这些机制尽量灵活,它们将通过环境变量的定义而激活。比如,典型的示例有BrowserMatch ,尽管SetEnvPassEnv也能使用。

    mod_deflate提供的DEFLATE输出过滤器。如果你更喜欢使用静态的压缩文件;mod_negotiation也同样使用该变量(不单单是gzip,而是所有不具有"同一性"的编码)。

    mod_deflate中的DEFLATE过滤器将被禁用,同时mod_negotiation将拒绝发送经过编码的资源。

    KeepAlive将被禁用。

    prefer-language

    此变量将影响mod_negotiation的行为。如果它包含一个语言标签(如:enfrzh_cnx-方言),mod_negotiation将尝试发送一个标签指定的语言的变种,如果不存在这样的变种,则使用通常的内容协商处理过程。

    mod_proxy协议的行为,参见mod_proxy文档以获得更多细节。

    Apache的环境变量

    《保护你的图片不为他人所用》。