htaccess If ... Else总是选择Else

时间:2016-09-13 03:59:03

标签: apache .htaccess environment-variables apache2.4

我在 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设置为使用SetEnvSetEnvIf之上的If / Else。始终执行 Else 分支。

为什么会这样?

Apache 2.4

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指令在请求处理意义上运行得晚   SetEnvIfRewriteCond等指令不会看到   用它设置的变量。

答案 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>