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>