在Apache设置中设置服务器环境变量时,可以使用内置函数从PHP读取该变量。
但是你能从htaccess文件中读取变量吗?
我想要在我的htaccess中实现的目标是:
<If var=="stuff">
do things here
</if>
<if var=="different stuff">
do different things here
</if>
答案 0 :(得分:6)
是的。
您可能希望使用mod_setenvif功能,因此需要打开该模块。
然后您只需执行以下操作:
SetEnvIf Request_URI "\.gif$" image_type=gif
如果请求的文件名以image_type
结尾,则会将环境变量gif
设置为.gif
。
然后你可以像这样访问它(比如在RewriteCond中):
RewriteCond %{ENV:image_type} gif
RewriteRule ^(.*) $.gif
您可以在此处阅读完整文档:http://httpd.apache.org/docs/2.2/env.html
答案 1 :(得分:4)
由于我在设置类似的事情时遇到了很多问题,认为我的家庭本地主机与我的工作设置截然不同,这就是我最终做的事情。
首先,<IF ..>
指令无法识别SetEnv。从http://httpd.apache.org/docs/current/env.html:&#34; SetEnv指令在请求处理期间运行较晚,这意味着SetEnvIf和RewriteCond等指令不会看到用它设置的变量。&#34;
所以,如果可以,尝试使用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 operator等人:http://httpd.apache.org/docs/current/expr.html)
答案 2 :(得分:3)
Apache 2.4引入了<If>
,<Else>
,<ElseIf>
块以及新的表达式语法,以便在.htaccess文件中实现更强大的编程控制等。
这是未经测试但表面上有效:
<If "%{MY_VAR} == 'my result'">
…
</If>
答案 3 :(得分:1)
我在这里给出了描述和.htaccess以及PHP示例:Set an environment variable in .htaccess and retrieve it in PHP
仅针对.htaccess中的一些示例,取自我修改Perishable Press 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给出第二个。连字符是字面显示字符,用于在视觉上分开(不要认为有任何方法可以在其中放置空格)。