欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Apache 模块 mod_setenvif 有大用 有大大用

Apache 模块 mod_setenvif

Description:允许根据请求的 Feature 设置环境变量
Status:Base
Module Identifier:setenvif_module
Source File:mod_setenvif.c

Summary

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

指令按照在配置文件中出现的 Sequences 进行考虑。因此,可以使用更复杂的序列,例如本示例,如果浏览器是 mozilla 而不是 MSIE,则它将设置netscape

BrowserMatch ^Mozilla netscape
BrowserMatch MSIE !netscape

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

BrowserMatch Directive

Description:设置以 HTTP User-Agent 为条件的环境变量
Syntax:BrowserMatch regex [!]env-variable[=value] [[!]env-variable[=value]] ...
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Base
Module:mod_setenvif

BrowserMatchSetEnvIf指令的特殊情况,该指令将环境变量设置为以User-Agent HTTP 请求 Headers 为条件。以下两行具有相同的效果:

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

BrowserMatchNoCase Directive

Description:设置环境变量以用户代理为条件,不考虑大小写
Syntax:BrowserMatchNoCase regex [!]env-variable[=value] [[!]env-variable[=value]] ...
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Base
Module: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

SetEnvIf Directive

Description:根据请求的属性设置环境变量
Syntax:SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Base
Module:mod_setenvif

SetEnvIf伪指令基于请求的属性定义环境变量。在第一个参数中指定的* attribute *可以是以下四项之一:

  • HTTP 请求 Headers 字段(有关这些的更多信息,请参见RFC2616);例如:HostUser-AgentRefererAccept-Language。正则表达式可用于指定一组请求 Headers。

  • 请求的以下方面之一:

  • Remote_Host-发出请求的 Client 端的主机名(如果有)

  • Remote_Addr-发出请求的 Client 端的 IP 地址

  • Server_Addr-接收请求的服务器的 IP 地址(仅适用于 2.0.43 之后的版本)

  • Request_Method-所用方法的名称(GETPOST,* et cetera *)

  • Request_Protocol-用来发出请求的协议的名称和版本(例如,“ HTTP/0.9”,“ HTTP/1.1”,* etc. *)

  • Request_URI-HTTP 请求行上请求的资源-通常在方案和主机部分之后的 URL 部分,没有查询字符串。有关如何匹配查询字符串的更多信息,请参见mod_rewriteRewriteCond指令。

  • 与请求关联的环境变量列表中的环境变量的名称。这允许SetEnvIf指令针对先前的匹配结果进行测试。只有早期的SetEnvIf[NoCase]指令定义的那些环境变量才能以这种方式进行测试。 “更早”是指它们是在更广泛的范围内定义的(例如在服务器范围内),或者以前在当前指令的范围内定义。仅当请求 Feature 之间不匹配并且正则表达式未用于* attribute *时,才考虑环境变量。

第二个参数(* regex )是regular expression。如果 regex  attribute *相匹配,则将评估其余参数。

其余参数提供要设置的变量的名称,以及可选的应设置变量的值。这些采取的形式

  • varname,或

  • !varname,或

  • varname=value

在第一种形式中,该值将设置为“ 1”。第二个将删除给定变量(如果已定义),第三个将将该变量设置为value给定的 Literals 值。从 2.0.51 版开始,Apache httpd 将识别值中出现的$1 .. $9并将其替换为正则表达式的带括号的子表达式。 $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,如果引用页面位于www.mydomain.example.com网站上的某个位置,则前四个将设置intra_site_referral

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

See also

SetEnvIfExpr Directive

Description:根据 ap_expr 表达式设置环境变量
Syntax:SetEnvIfExpr expr [!]env-variable[=value] [[!]env-variable[=value]] ...
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Base
Module:mod_setenvif

SetEnvIfExpr指令基于<If> ap_expr定义环境变量。这些表达式将在运行时求值,并以与SetEnvIf相同的方式应用* env-variable *。

SetEnvIfExpr "tolower(req('X-Sendfile')) == 'd:\images\very_big.iso')" iso_delivered

每当我们的应用程序尝试通过X-Sendfile发送环境变量iso_delivered时,就会设置环境变量iso_delivered

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

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

See also

SetEnvIfNoCase Directive

Description:根据请求的属性设置环境变量,而不考虑大小写
Syntax:SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Base
Module:mod_setenvif

SetEnvIfNoCase在语义上与SetEnvIf伪指令相同,不同之处仅在于,正则表达式匹配以不区分大小写的方式执行。例如:

SetEnvIfNoCase Host Example\.Org site=example

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


来自  https://www.docs4dev.com/docs/zh/apache/2.4/reference/mod-mod_setenvif.html


普通分类: