<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_setenvif

可用语言:  en  |  fr  |  ja  |  ko  |  tr 

描述允许根据请求的特性设置环境变量
状态基础
模块标识符setenvif_module
源文件mod_setenvif.c

摘要

mod_setenvif 模块允许您根据请求的不同方面是否与您指定的正则表达式匹配来设置内部环境变量。这些环境变量可以被服务器的其他部分用来决定要采取的操作,也可以被 CGI 脚本和 SSI 页面使用。

这些指令按它们在配置文件中出现的顺序进行考虑。因此,可以使用更复杂的序列,例如以下示例,它在浏览器是 Mozilla 但不是 MSIE 的情况下设置 netscape

BrowserMatch ^Mozilla netscape
BrowserMatch MSIE !netscape

当服务器通过内部 子请求(例如查找 DirectoryIndex 或使用 mod_autoindex 生成目录列表)查找路径时,每个请求的环境变量不会在子请求中继承。此外,由于 mod_setenvif 所采取的 API 阶段,SetEnvIf 指令不会在子请求中单独评估。

Support Apache!

指令

Bugfix 检查表

另请参阅

top

BrowserMatch 指令

描述根据 HTTP User-Agent 设置环境变量
语法BrowserMatch regex [!]env-variable[=value] [[!]env-variable[=value]] ...
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态基础
模块mod_setenvif

BrowserMatchSetEnvIf 指令的一种特殊情况,它根据 User-Agent HTTP 请求头设置环境变量。以下两行具有相同的效果

BrowserMatch Robot is_a_robot
SetEnvIf User-Agent Robot is_a_robot

一些额外的示例

BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
BrowserMatch MSIE !javascript
top

BrowserMatchNoCase 指令

描述根据 User-Agent 设置环境变量,不区分大小写
语法BrowserMatchNoCase regex [!]env-variable[=value] [[!]env-variable[=value]] ...
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态基础
模块mod_setenvif

BrowserMatchNoCase 指令在语义上与 BrowserMatch 指令相同。但是,它提供不区分大小写的匹配。例如

BrowserMatchNoCase mac platform=macintosh
BrowserMatchNoCase win platform=windows

BrowserMatchBrowserMatchNoCase 指令是 SetEnvIfSetEnvIfNoCase 指令的特殊情况。以下两行具有相同的效果

BrowserMatchNoCase Robot is_a_robot
SetEnvIfNoCase User-Agent Robot is_a_robot
top

SetEnvIf 指令

描述根据请求的属性设置环境变量
语法SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态基础
模块mod_setenvif

SetEnvIf 指令根据请求的属性定义环境变量。第一个参数中指定的 attribute 可以是以下四种情况之一

  1. HTTP 请求头字段(有关这些字段的更多信息,请参阅 RFC2616);例如:HostUser-AgentRefererAccept-Language。可以使用正则表达式来指定一组请求头。
  2. 请求的以下方面之一
    • Remote_Host - 发出请求的客户端的主机名(如果可用)
    • Remote_Addr - 发出请求的客户端的 IP 地址
    • Server_Addr - 接收请求的服务器的 IP 地址(仅在 2.0.43 之后的版本中可用)
    • Request_Method - 使用的方法的名称(GETPOST 等)
    • Request_Protocol - 发出请求时使用的协议的名称和版本(例如,“HTTP/0.9”、“HTTP/1.1”等)
    • Request_URI - HTTP 请求行中请求的资源 - 通常是 URL 中在方案和主机部分之后且不包含查询字符串的部分。有关如何匹配查询字符串的更多信息,请参阅 mod_rewriteRewriteCond 指令。
  3. 与请求关联的环境变量列表中的环境变量的名称。这允许 SetEnvIf 指令针对先前匹配的结果进行测试。只有由早期的 SetEnvIf[NoCase] 指令定义的环境变量才能以这种方式进行测试。“更早”意味着它们是在更广泛的范围内(例如服务器范围)或在当前指令范围内的先前位置定义的。只有在请求特征中没有匹配且 attribute 未使用正则表达式的情况下,才会考虑环境变量。

第二个参数(regex)是一个 正则表达式。如果 regexattribute 匹配,则评估其余参数。

其余参数给出要设置的变量的名称,以及可选地要设置的值。它们采用以下形式

  1. varname,或
  2. !varname,或
  3. varname=value

在第一种形式中,该值将被设置为“1”。第二种形式将在已定义的情况下删除给定的变量,第三种形式将该变量设置为 value 给出的文字值。从版本 2.0.51 开始,Apache httpd 将识别 value$1..$9 的出现,并用 regex 的带括号的子表达式替换它们。$0 提供对该模式匹配的整个字符串的访问权限。

SetEnvIf Request_URI "\.gif$" object_is_image=gif
SetEnvIf Request_URI "\.jpg$" object_is_image=jpg
SetEnvIf Request_URI "\.xbm$" object_is_image=xbm
    
SetEnvIf Referer www\.mydomain\.example\.com intra_site_referral
    
SetEnvIf object_is_image xbm XBIT_PROCESSING=1
    
SetEnvIf Request_URI "\.(.*)$" EXTENSION=$1

SetEnvIf ^TS  ^[a-z]  HAVE_TS

前三个将设置环境变量 object_is_image,如果请求的是图像文件,第四个将设置 intra_site_referral,如果引用页面位于 www.mydomain.example.com 网站上。

最后一个示例将在请求包含任何以“TS”开头的标头且其值以 [a-z] 集合中的任何字符开头的标头时设置环境变量 HAVE_TS

另请参阅

top

SetEnvIfExpr 指令

描述根据 ap_expr 表达式设置环境变量
语法SetEnvIfExpr expr [!]env-variable[=value] [[!]env-variable[=value]] ...
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态基础
模块mod_setenvif

SetEnvIfExpr 指令根据 表达式 定义环境变量。这些表达式将在运行时进行评估,并以与 SetEnvIf 相同的方式应用 env-variable,包括反向引用。

    SetEnvIfExpr "tolower(req('X-Sendfile')) == 'd:\images\very_big.iso')" iso_delivered
    SetEnvIfExpr "tolower(req('X-Sendfile')) =~ /(.*\.iso$)/" iso-path=$1

这将在我们的应用程序尝试通过 X-Sendfile 发送它时设置环境变量 iso_delivered

一个更有用的示例是根据 RFC 1918 设置变量 rfc1918,如果远程 IP 地址是私有地址。

SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918

另请参阅

top

SetEnvIfNoCase 指令

描述根据请求的属性设置环境变量,不区分大小写
语法SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态基础
模块mod_setenvif

SetEnvIfNoCase 在语义上与 SetEnvIf 指令相同,唯一的区别是正则表达式匹配以不区分大小写的方式执行。例如

SetEnvIfNoCase Host Example\.Org site=example

这将导致如果 HTTP 请求头字段 Host: 包含 Example.Orgexample.org 或任何其他组合,则环境变量 site 将被设置为“example”。

可用语言:  en  |  fr  |  ja  |  ko  |  tr 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们被实施或被认为无效/与主题无关,则可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应直接发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表