欢迎各位兄弟 发布技术文章
这里的技术是共享的
Description: | 允许根据请求的 Feature 设置环境变量 |
---|---|
Status: | Base |
Module Identifier: | setenvif_module |
Source File: | mod_setenvif.c |
mod_setenvif模块允许您根据请求的不同方面是否匹配您指定的正则表达式来设置内部环境变量。服务器的其他部分可以使用这些环境变量来决定要采取的措施,以及可以用于 CGI 脚本和 SSI 页面。
指令按照在配置文件中出现的 Sequences 进行考虑。因此,可以使用更复杂的序列,例如本示例,如果浏览器是 mozilla 而不是 MSIE,则它将设置netscape
。
BrowserMatch ^Mozilla netscape
BrowserMatch MSIE !netscape
当服务器通过内部subrequest查找路径(例如查找DirectoryIndex或使用mod_autoindex生成目录列表)时,在子请求中不会继承每个请求的环境变量。此外,由于 API 阶段mod_setenvif会采取行动,因此在子请求中不会单独评估SetEnvIf指令。
Description: | 设置以 HTTP User-Agent 为条件的环境变量 |
---|---|
Syntax: | BrowserMatch regex [!]env-variable[=value] [[!]env-variable[=value]] ... |
Context: | 服务器配置,虚拟主机,目录,.htaccess |
Override: | FileInfo |
Status: | Base |
Module: | mod_setenvif |
BrowserMatch
是SetEnvIf指令的特殊情况,该指令将环境变量设置为以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
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
BrowserMatch
和BrowserMatchNoCase
指令是SetEnvIf和SetEnvIfNoCase指令的特殊情况。以下两行具有相同的效果:
BrowserMatchNoCase Robot is_a_robot
SetEnvIfNoCase User-Agent Robot is_a_robot
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);例如:Host
,User-Agent
,Referer
和Accept-Language
。正则表达式可用于指定一组请求 Headers。
请求的以下方面之一:
Remote_Host
-发出请求的 Client 端的主机名(如果有)
Remote_Addr
-发出请求的 Client 端的 IP 地址
Server_Addr
-接收请求的服务器的 IP 地址(仅适用于 2.0.43 之后的版本)
Request_Method
-所用方法的名称(GET
,POST
,* et cetera *)
Request_Protocol
-用来发出请求的协议的名称和版本(例如,“ HTTP/0.9”,“ HTTP/1.1”,* etc. *)
Request_URI
-HTTP 请求行上请求的资源-通常在方案和主机部分之后的 URL 部分,没有查询字符串。有关如何匹配查询字符串的更多信息,请参见mod_rewrite的RewriteCond指令。
与请求关联的环境变量列表中的环境变量的名称。这允许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
。
Apache HTTP Server 中的环境变量,以获取其他示例。
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
Apache HTTP Server 中的表达式,以获取完整参考和更多示例。
<If>可用于获得类似的结果。
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.Org
,example.org
或任何其他组合,则这将导致site
环境变量设置为“ example
”。
来自 https://www.docs4dev.com/docs/zh/apache/2.4/reference/mod-mod_setenvif.html