设置Apache的环境变量,使用PHP的$_SERVER来读取的方法

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

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

top

设定环境变量

相关模块 相关指令

基本环境变量的操作

设定Apache下环境变量的一个最普通方法, 就是使用没有什么限制的SetEnv指令。 也可以用PassEnv 指令将启动服务器的操作系统外壳的环境变量传进来。

随请求而变的条件设定

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

唯一标识符

最后,mod_unique_id将为每个请求设定环境变量UNIQUE_ID为一个值, 这个值对”所有”请求都是唯一的,即使在极为特定的条件下。

标准CGI变量

在所有Apache配置中的环境变量和由操作系统外壳传来的环境变量之外, 还有一组环境变量用以提供CGI脚本和SSI页面。此套变量包含由CGI规范要求的请求的元信息。

一些提示

  • 用环境变量操作指令来覆盖或修改标准的CGI变量是不可能的。
  • 当用suexec来载入CGI脚本时, 环境变量将会被清除到在CGI脚本载入之前只剩一套安全变量。 安全变量的列表在编译期中在suexec.c中进行了定义。
  • 出于可移植性的考虑,环境变量的命名必须仅包含数字、字母和下划线。 此外,第一个符号不能为数字。 不符合此要求的字符将在传递给CGI脚本和SSI页面时会被下划线取代。
top

使用环境变量

相关模块 相关指令

CGI脚本

环境变量的最主要用途之一就是把信息传递给CGI脚本。如上所述, 在Apache配置中环境变量以外,还有一组包含请求相关的标准元信息的环境变量传给了CGI脚本。 更多细节请参见CGI教程

SSI页面

由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_filterExtFilterDefine指令 配置的外部过滤器可以用disableenv=enableenv=选项 根据环境变量的条件进行激活。

URL重写

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

top

用于特殊目的的环境变量

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

downgrade-1.0

它将强制把请求当作一个HTTP/1.0的请求来处理,不管这个请求是不是符合更新的标准。

force-no-vary

此变量将在送回到客户端之前删除所有的Vary字段。 一些客户端不能正确地解析此字段。 (参见已知的客户端问题页面); 此变量的设定将解决此问题,同时隐含了force-response-1.0

force-response-1.0

此变量设定后将强制进行HTTP/1.0的回应。它的实现源于一个AOL的代理产生的问题。 一些客户端在收到HTTP/1.1的回应后会有不正常的举动。而此变量能够解决这一问题。

gzip-only-text/html

当此变量的值被设为“1”,这个变量将禁用text/html之外的内容类型使用由mod_deflate提供的压缩输出过滤器。

no-gzip

如果设置了此变量, mod_deflate中的DEFLATE过滤器将被禁用。

nokeepalive

如果设置了此变量,KeepAlive将被禁用。

redirect-carefully

此变量将使服务器在对客户端发送转向命令时更加小心。 典型应用于已知客户端处理转向指令存在问题时。 它的实现源于微软的WebFolders软件存在的一个问题。 它在经由DAV方法在目录资源上处理重定向命令时会有问题。

suppress-error-charset

存在于2.0.40后的版本中

当Apache针对用户请求回应了一个重定向命令的时候,这个回应中包含了一些文字。 这些文字将在客户端不能(或没有)自动执行重定向操作的情况下显示。 Apache会将这段文字按照它所使用的字符集进行编排,一般来说是ISO-8859-1。

然而,如果重定向的目的页面使用了不同的字符集, 一些有问题的浏览器版本会使用重定向命令文本的字符集,而不是采用目的页面的。 比如,希腊文就不会被正确的显示。

此环境变量的设定将使Apache忽略重定向命令文本的字符集设置, 那么这些有问题的浏览器就会正确的使用目的页的字符集。

top

示例

针对表现不正当的客户端改变协议的行为

我们建议将以下示例包含到你的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

   Order Deny,Allow
   Deny from all
   Allow from env=local_referal

设置Apache的环境变量,使用PHP的$_SERVER来读取的方法》有2个想法

  1. 脑袋说道:

    简单的就是这样的:
    setenv naodai http://ifelsend.com

发表评论

返回顶部