J'ai défini une variable d'environnement dans httpd-vhosts.conf
SetEnv EARLY_VAR 1
J'essaie de définir des règles spéciales basées sur sa valeur dans .htaccess
<If "%{ENV:EARLY_VAR} == '1'">
SetEnv TEST_VAR if_branch
</If>
<Else>
SetEnv TEST_VAR else_branch
</Else>
Je m'attends à ce que TEST_VAR
environment var soit égal à if_branch
. DansPHP
var_dump(getenv('EARLY_VAR')); // string '1'
var_dump(getenv('TEST_VAR')); // string 'else_branch'
J'ai également essayé de définir EARLY_VAR
dans .htaccess
au-dessus de If/Else, les deux en utilisant SetEnv
et SetEnvIf
. La branche Else est toujours exécutée.
Pourquoi est-ce?
Apache 2.4
Sans utiliser l'expression i.e. if/else
, vous pouvez le faire:
# 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
Cela fonctionnera avec des versions encore plus anciennes d’Apache, c.-à-d. <2.4
MODIFIER:
Dans votre configuration Apache ou vhost, cette initialisation de variable est la suivante:
SetEnvIf Host ^ EARLY_VAR=5
Ensuite, dans votre .htaccess, vous pouvez utiliser:
<If "env('EARLY_VAR') == '5'">
SetEnv TEST_VAR if_branch
</If>
<Else>
SetEnv TEST_VAR else_branch
</Else>
Raison pour laquelle vous avez besoin de la déclaration de variable env dans Apache/vhost config, car .htaccess est chargé après la configuration Apache/vhost et les variables env définies dans le même fichier .htaccess ne sont pas disponibles pour évaluation dans les expressions if/else
.
Notez également qu'il est important d'utiliser SetEnvIf
au lieu de SetEnv
pour rendre ces variables disponibles pour les expressions if/else
.
En regardant la documentation de directive SetEnv
, je remarque:
Définit une variable d'environnement interne, qui est ensuite disponible pour les modules Apache HTTP Server et transmise aux scripts CGI et aux pages SSI .
ce qui signifie que les environnements sont alors disponibles pour les autres modules. Alors que, la directive <if>
est fournie par le noyau. Cela peut être confirmé si vous essayez de voir si l'environnement est vide pendant la clause <if>
:
<If "-z %{ENV:EARLY_VAR}">
SetEnv TEST_VAR if_branch
</If>
ou
<If "-z env('EARLY_VAR')">
SetEnv TEST_VAR if_branch
</If>
les deux vous donneront:
string(1) "1" string(9) "if_branch"
dans votre PHP.
Les mises en garde suivantes figurent également sur les pages variables d'environnement wiki/docs d'Apache:
La directive
SetEnv
est en retard au cours du traitement de la demande, ce qui signifie Que les directives telles queSetEnvIf
etRewriteCond
ne verront pas les variables Définies avec elle.
La seule façon pour que cela fonctionne est d’utiliser SetEnvIf les deux en .conf
et .htaccess
:
J'ai utilisé seulement ceci dans .conf
SetEnvIf Server_Addr ^ EARLY_VAR=1
et alors seulement ceci dans .htaccess
:
SetEnvIf EARLY_VAR ^ TEST_VAR=else_branch
SetEnvIf EARLY_VAR ^1$ TEST_VAR=if_branch
(sans directive If
. Quoi que j'ai essayé dans If
, il semblait que cela avait été évalué avant que EARLY_VAR ne soit défini)
Si vous avez rencontré un problème avec SetEnv et SetEnvIf dans votre configuration Apache.
Définissez la variable dans le fichier httpd.conf
comme ci-dessous
SetEnvIf Host ".*" EARLY_VAR=1
SetEnvIf Host eval EARLY_VAR=1
SetEnvIf Host dev EARLY_VAR=1
Il attribue la valeur dans tout type de serveur (production ,evaluation or development)
Vous pouvez maintenant utiliser votre variable dans le fichier .htaccess
.
<IF "%{ENV:EARLY_VAR} == 1">
SetEnv TEST_VAR if_value
</IF>
<ELSE>
SetEnv TEST_VAR else_value
</ELSE>