在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这样的指令将看不到用它设置的变量。
所以,如果可以的话,尝试使用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/以使用环境变量报告:
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是第二个。 连字符是文字显示字符,以可视化分离(不要以为是有任何方法把空间在那里)。