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>