it-swarm.com.de

htaccess Wenn ... Else wählt immer Else

Ich setze eine Umgebungsvariable in httpd-vhosts.conf

SetEnv EARLY_VAR 1

Ich versuche, spezielle Regeln basierend auf ihrem Wert in .htaccess festzulegen.

<If "%{ENV:EARLY_VAR} == '1'">
   SetEnv TEST_VAR  if_branch
</If>
<Else>
    SetEnv TEST_VAR  else_branch
</Else>

Ich erwarte, dass TEST_VAR Umgebung var gleich if_branch ist. InPHP

var_dump(getenv('EARLY_VAR')); // string '1'
var_dump(getenv('TEST_VAR')); // string 'else_branch'

Ich habe auch versucht, EARLY_VAR in .htaccess oberhalb von If/Else einzustellen, beide mit SetEnv und SetEnvIf. Immer wird der Zweig Else ausgeführt.

Warum ist das?

Apache 2.4

15
BeetleJuice

Ohne Ausdruck, d. H. if/else-Anweisungen, können Sie Folgendes tun:

# 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

Dies funktioniert auch mit älteren Apache-Versionen, d. H. <2.4


BEARBEITEN:

In Ihrer Apache-Konfiguration haben Sie folgende Variableninitialisierung:

SetEnvIf Host ^ EARLY_VAR=5

Dann können Sie in Ihrem .htaccess Folgendes verwenden:

<If "env('EARLY_VAR') == '5'">
   SetEnv TEST_VAR if_branch
</If>
<Else>
   SetEnv TEST_VAR else_branch
</Else>

Grund, warum Sie in Apache/vhost config eine Deklaration der env-Variablen benötigen, weil .htaccess nach der Konfiguration von Apache/vhost geladen wird und die in derselben .htaccess-Klasse gesetzten env-Variablen nicht in if/else-Ausdrücken ausgewertet werden können.

Beachten Sie auch, dass es wichtig ist, SetEnvIf anstelle von SetEnv zu verwenden, um diese Variablen für if/else-Ausdrücke verfügbar zu machen.

7
anubhava

Wenn ich mir die Dokumentation der SetEnv Anweisung ansehe , stelle ich fest:

Legt eine interne Umgebungsvariable fest, die dann für Apache HTTP Server-Module verfügbar ist und an CGI-Skripts und SSI-Seiten (.____.) Übergeben wird.

das bedeutet, dass die Umgebungen dann für andere Module verfügbar sind. Die <if>-Direktive wird vom Kern vorgegeben. Dies kann bestätigt werden, wenn Sie während der <if>-Klausel feststellen, ob die Umgebung leer ist:

<If "-z %{ENV:EARLY_VAR}">
   SetEnv TEST_VAR  if_branch
</If>

oder

<If "-z env('EARLY_VAR')">
   SetEnv TEST_VAR  if_branch
</If>

beide geben dir:

string(1) "1" string(9) "if_branch" 

in deinem PHP.


Auf den Umgebungsvariablen wiki/docs der Apache-Umgebungsvariablen gibt es außerdem folgende Einschränkung:

Die SetEnv-Direktive wird während der Anforderungsverarbeitung spät ausgeführt, dh Bedeutet, dass Direktiven wie SetEnvIf und RewriteCond die mit Gesetzten Variablen nicht angezeigt werden.

5
hjpotter92

Die einzige Möglichkeit, wie ich es schaffen könnte, ist die Verwendung von SetEnvIf beide in .conf und .htaccess:

Ich habe nur dies in .conf verwendet 

SetEnvIf Server_Addr ^ EARLY_VAR=1

und dann nur das in .htaccess:

SetEnvIf EARLY_VAR ^ TEST_VAR=else_branch
SetEnvIf EARLY_VAR ^1$ TEST_VAR=if_branch

(Ohne If-Direktive. Was auch immer ich in If versucht habe, es schien, als wäre es ausgewertet worden, bevor EARLY_VAR gesetzt wurde.)

1
Dusan Bajic

Wenn Sie ein Problem mit SetEnv und SetEnvIf in Ihrer Apache-Konfiguration gefunden haben.

Setze die Variable in httpd.conf Datei wie folgt

SetEnvIf Host ".*" EARLY_VAR=1
SetEnvIf Host eval EARLY_VAR=1
SetEnvIf Host dev EARLY_VAR=1

Es weist den Wert in allen Servertypen zu (production ,evaluation or development)

Jetzt können Sie Ihre Variable in .htaccess-Datei verwenden. 

<IF "%{ENV:EARLY_VAR} == 1">
    SetEnv TEST_VAR if_value
</IF>
<ELSE>
    SetEnv TEST_VAR else_value
</ELSE>
0
SCC