Htaccess Если... Else всегда выбирает Else

Я установил переменную среды в 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 environment 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

Ответы

Ответ 1

Без использования директив iEe 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 и переменные env, установленные в том же .htaccess, недоступны для оценки в выражениях if/else.

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

Ответ 2

Глядя на документацию директивы 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, не будут видеть переменные, заданные вместе с ним.

Ответ 3

Единственный способ заставить его работать: 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

(без директивы If. Что бы я ни пытался в If, казалось, что она была оценена до того, как установлен EARLY_VAR)

Ответ 4

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

Задайте переменную в 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>