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
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.
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 wieSetEnvIf
undRewriteCond
die mit Gesetzten Variablen nicht angezeigt werden.
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.)
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>