2016-09-13 2 views
14

я установить переменные окружения в HTTPd-vhosts.confHtaccess Если ... Else всегда выбирает ELSE

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 Окружающая среда 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

+0

Не видя '% {ENV:' как действительное выражение здесь ~ http://httpd.apache.org/docs/2.4/expr.html. Есть функция 'env', хотя – Phil

+2

@Phil Спасибо за подсказку. Язык документации на этой странице трудно понять, но я думаю, что вы поместили меня на правильный путь. – BeetleJuice

+0

@Phil '% {ENV:' также действителен. И будет расширен как '%%" funcname ": funcargs} "' – hjpotter92

ответ

6

без использования выражения т.е. 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 или ВХост конфигурации имеет эти переменные инициализации:

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/ВХост конфигурации, потому что .htaccess загружается после того, как параметры Apache/vhost и env, установленные в том же .htaccess, недоступны для оценки в выражениях if/else.

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

+0

Спасибо. Я использую '' и '' потому что я хочу обернуть большой блок из многих директив для двух разных сред.Я использовал «SetEnv» в блоках так же, как быстрый способ проверить мой скрипт PHP, какая ветка была выполнена. Мне действительно не нужно устанавливать этот 'TEST_VAR'. Это место для группы директив. – BeetleJuice

+1

Хорошо объяснил. Он работал на моей машине dev, но на сервере я получаю ошибку '/path/.htaccess: Invalid command 'SetEnv', возможно, ошибочно написана или определена модулем, не включенным в конфигурацию сервера. Итак, чтобы установить TEST_VAR в htaccess, я сделал 'SetEnvIf Host^TEST_VAR = if_branch'. Спасибо – BeetleJuice

+0

Рад, что это сработало. Разработчики Hope Apache считают эту функцию более работоспособной в будущих версиях. Потому что не все будут иметь доступ к месту «SetEnvIf» в конфигурации Apache/vhost. – anubhava

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 работает поздно во время обработки запроса, означающего , что директивы, такие как SetEnvIf и RewriteCond не будут видеть набор переменных с этим.

+0

Спасибо за ваш ввод и тесты. Означает ли это, что я не могу использовать ветвление 'If/Else', основанное на среде var? В частности, var устанавливается в том же '.htaccess'. Возможно, он может работать с var, установленным через 'SetEnvIf'? – BeetleJuice

+0

@BeetleJuice Не в том же контексте, нет! Вы должны установить среду в контексте по крайней мере на один уровень выше директивы ''. – hjpotter92

+0

См. Комментарий в ответ @ anubhava для описания того, что здесь происходит. Это не проблема закрывающего раздела, потому что это не повлияет на время выполнения. – covener

1

Единственный способ, которым я мог бы сделать его работу использует 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)

+0

Просьба указать, означает ли вы, что вы сделали то или другое, или вам нужно было сделать оба ('.conf' и' .htaccess' настройки). Также покажите выражение в ''. – BeetleJuice

+0

Нет «Если», к сожалению, поэтому удобство использования этого подхода довольно ограничено –

0

Если вы обнаружили проблему с 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> 
Смежные вопросы