htaccess可以读取在Apache中设置的服务器环境variables吗?

Apache设置中设置服务器环境variables时,可以使用内置函数从PHP读取该variables。

但是,你可以从一个htaccess文件读取variables?

我正在尝试在我的htaccess中完成的事情大致如下:

<If var=="stuff"> do things here </if> <if var=="different stuff"> do different things here </if> 

是的。

你可能会想使用mod_setenvif功能,所以这个模块需要打开。

然后,你只需要做一些事情:

 SetEnvIf Request_URI "\.gif$" image_type=gif 

如果请求的文件名以.gif结尾,那么将设​​置环境变量image_type的值为gif

你可以像这样访问这个(就像在RewriteCond中一样):

 RewriteCond %{ENV:image_type} gif RewriteRule ^(.*) $.gif 

你可以在这里阅读完整的文档: http : //httpd.apache.org/docs/2.2/env.html

由于我在设置类似的东西时遇到了很多问题,以致于认识到我的本地主机与我的工作不同,所以我最终做了这些事情。

首先, <IF ..>指令不能识别SetEnv。 从http://httpd.apache.org/docs/current/env.html:“SetEnv指令在请求处理期间延迟运行,这意味着像SetEnvIf和RewriteCond这样的指令将看不到用它设置的变量&#x3002;

所以,如果可以的话,尝试使用SetEnvIf。 我很懒,只是把它放在我的httpd.conf文件中。 它检查它是否在localhost上运行 – 显然是 – 然后设置变量:

 SetEnvIf server_Addr ^127\.0\.0\.1$ home_variable 

然后,在其他地方,在我的htaccess文件中,我有这样的:

 # IfVersion needs mod_version - you could do an ifmodule before all this i guess # we use ifversion because If was introduced in apache 2.4 <IfVersion >= 2.4> # check if the home variable exists/isn't: empty, "0", "off", "false", or "no" <If "-T reqenv('home_variable')"> ... do home-y stuff </If> <Else> ... do work-y stuff </Else> </IfVersion> # fallback <IfVersion < 2.4> .. fallback? </IfVersion> 

或者,您可以为每个环境只设置一个变量,并给它一个特定的值:

 SetEnvIf server_Addr ^127\.0\.0\.1$ check_location=home 

那么其余的将是相同的,除了第一个<If ..>声明:

 <If "%{ENV:check_location} == 'home'">....</If> 

我已经测试了2.4版本的家庭环境和2.2版本的工作环境,两者都启用了mod_version(因此不会影响ifmod)。

(我也没有测试两个以上的环境,但Apache 2.4确实给出了一个<ElseIf>所以这也是一个选项)。

Doop di do。

(关于-T操作符的更多信息: http : //httpd.apache.org/docs/current/expr.html )

Apache 2.4引入了<If><Else><ElseIf>块和一个新的表达式语法,用于更强大的.htaccess文件中的程序控制等。

这是未经测试,但表面上工作:

 <If "%{MY_VAR} == 'my result'"> … </If> 

资料来源: https : //blogs.apache.org/httpd/entry/new_in_httpd_2_4

我在这里给出了描述和.htaccess和PHP示例: 在.htaccess中设置一个环境变量,并用PHP检索它

对于.htaccess中的一些示例,取自我的修改易腐按5G黑名单/防火墙http://perishablepress.com/5g-blacklist-2013/以使用环境变量报告&#xFF1A;

 SetEnv myserverName %{SERVER_NAME} RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig|open_basedir) [NC,OR] RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR] RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC] RewriteRule .* - [E=badQueryString:%0--%1--%2,F,L] SetEnvIfNoCase User-Agent ^$ noUserAgent SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) badUserAgent=$1 <limit GET POST PUT> Order Allow,Deny Allow from all Deny from env=badUserAgent </limit> 

注意使用参数。 %0给出了完整的字符串,%1给出了来自第一个括号内的语句的匹配,%2是第二个。 连字符是文字​​显示字符,以可视化分离(不要以为是有任何方法把空间在那里)。