web-dev-qa-db-fra.com

htaccess If ... Else sélectionne toujours Else

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

15
BeetleJuice

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.

7
anubhava

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 que SetEnvIf et RewriteCond ne verront pas les variables Définies avec elle.

5
hjpotter92

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)

1
Dusan Bajic

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>
0
SCC