我在 httpd-vhosts.conf
中设置了一个环境变量SetEnv EARLY_VAR 1
我尝试根据 .htaccess
中的值设置特殊规则<If "%{ENV:EARLY_VAR} == '1'">
SetEnv TEST_VAR if_branch
</If>
<Else>
SetEnv TEST_VAR else_branch
</Else>
我希望TEST_VAR
环境变量等于if_branch
。在 PHP
var_dump(getenv('EARLY_VAR')); // string '1'
var_dump(getenv('TEST_VAR')); // string 'else_branch'
我还尝试在EARLY_VAR
中将.htaccess
设置为使用SetEnv
和SetEnvIf
之上的If / Else。始终执行 Else 分支。
为什么会这样?
Apache 2.4
答案 0 :(得分:7)
不使用表达式即if/else
指令,您可以这样做:
# set EARLY_VAR to 1
SetEnvIf Host ^ EARLY_VAR=1
# if EARLY_VAR is 1 then set TEST_VAR to if_branch
SetEnvIf EARLY_VAR ^1$ TEST_VAR=if_branch
# if EARLY_VAR is NOT 1 then set TEST_VAR to else_branch
SetEnvIf EARLY_VAR ^(?!1$) TEST_VAR=else_branch
这适用于更老的Apache版本,即<2.4
修改强>
在你的Apache配置或vhost配置中有这个变量初始化:
SetEnvIf Host ^ EARLY_VAR=5
然后在你的.htaccess中你可以使用:
<If "env('EARLY_VAR') == '5'">
SetEnv TEST_VAR if_branch
</If>
<Else>
SetEnv TEST_VAR else_branch
</Else>
您需要在Apache / vhost配置中使用env变量声明的原因是因为.htaccess是在Apache / vhost配置和在同一.htaccess中设置的env变量无法在if/else
表达式中进行评估后加载的。
另请注意,使用SetEnvIf
代替SetEnv
来使if/else
表达式可以使用这些变量非常重要。
答案 1 :(得分:5)
查看SetEnv
directive的文档,我注意到:
设置内部环境变量,然后可以使用 Apache HTTP Server模块,并传递给CGI脚本和SSI 页。
这意味着环境可供其他模块使用。然而,<if>
指令由核心提供。如果您在<if>
子句期间尝试查看环境是否为空,则可以确认这一点:
<If "-z %{ENV:EARLY_VAR}">
SetEnv TEST_VAR if_branch
</If>
或
<If "-z env('EARLY_VAR')">
SetEnv TEST_VAR if_branch
</If>
两者都会给你:
string(1) "1" string(9) "if_branch"
在PHP中。
Apache的environment variables wiki/docs页面上还列出了以下警告:
SetEnv
指令在请求处理意义上运行得晚SetEnvIf
和RewriteCond
等指令不会看到 用它设置的变量。
答案 2 :(得分:1)
我能使其发挥作用的唯一方法是在.conf
和.htaccess
中使用SetEnvIf:
我在.conf
SetEnvIf Server_Addr ^ EARLY_VAR=1
然后仅在.htaccess
:
SetEnvIf EARLY_VAR ^ TEST_VAR=else_branch
SetEnvIf EARLY_VAR ^1$ TEST_VAR=if_branch
(没有If
指令。无论我在If
内尝试过什么,似乎在设置EARLY_VAR之前对其进行了评估)
答案 3 :(得分:0)
如果您在Apache配置中发现SetEnv和SetEnvIf有问题。
将httpd.conf
文件中的变量设置为
SetEnvIf Host ".*" EARLY_VAR=1
SetEnvIf Host eval EARLY_VAR=1
SetEnvIf Host dev EARLY_VAR=1
它在所有类型的服务器(production ,evaluation or development)
现在,您可以在.htaccess
文件中使用您的变量。
<IF "%{ENV:EARLY_VAR} == 1">
SetEnv TEST_VAR if_value
</IF>
<ELSE>
SetEnv TEST_VAR else_value
</ELSE>