htaccess If ... Else всегда выбирает Else

Я устанавливаю переменную окружения в httpd-vhosts.conf

SetEnv EARLY_VAR 1

Я пытаюсь установить специальные правила на основе его значения в .реврайт

<If "%{ENV:EARLY_VAR} == '1'">
   SetEnv TEST_VAR  if_branch
</If>
<Else>
    SetEnv TEST_VAR  else_branch
</Else>

Я жду TEST_VAR окружающая среда var равняется if_branch. В PHP

var_dump(getenv('EARLY_VAR')); // string '1'
var_dump(getenv('TEST_VAR')); // string 'else_branch'

я также попытался установить EARLY_VAR на .htaccess над If / Else, оба используют SetEnv и SetEnvIf. Всегда Else филиала выполняется.

почему это?

Apache 2.4

4 ответов


без использования выражения, т. е. 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


EDIT:

в вашей конфигурации 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>

причина, почему вам нужно объявление переменной env в конфигурации Apache /vhost, потому что.htaccess был загружен после того, как Apache / vhost config и env переменные установлены в том же .htaccess недоступны для оценки в if/else выражения.

кроме того, обратите внимание, что важно использовать SetEnvIf вместо SetEnv чтобы сделать эти переменные доступны к if/else выражения.


глядя на документацию SetEnv директива Я заметил:

задает внутреннюю переменную среды, которая затем доступна для 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 переменные среды wiki / docs страницы:

на SetEnv директива запаздывает во время обработки запроса это такие директивы, как SetEnvIf и RewriteCond не увидите переменные, установленные с ним.


единственный способ заставить его работать-это использовать SetEnvIf обоих в .conf и .htaccess:

я использовал только в .conf

SetEnvIf Server_Addr ^ EARLY_VAR=1

а потом только это в .htaccess :

SetEnvIf EARLY_VAR ^ TEST_VAR=else_branch
SetEnvIf EARLY_VAR ^1$ TEST_VAR=if_branch

(без


если вы нашли проблему с SetEnv и SetEnvIf в конфигурации Apache.

установите переменную в ниже

SetEnvIf Host ".*" EARLY_VAR=1
SetEnvIf Host eval EARLY_VAR=1
SetEnvIf Host dev EARLY_VAR=1

он присваивает значение во всех типах сервера (production ,evaluation or development)

теперь вы можете использовать переменную в .

<IF "%{ENV:EARLY_VAR} == 1">
    SetEnv TEST_VAR if_value
</IF>
<ELSE>
    SetEnv TEST_VAR else_value
</ELSE>