httpd-vhosts.confに環境変数を設定しました
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
環境変数はif_branch
と等しいと思います。 [〜#〜] php [〜#〜]
var_dump(getenv('EARLY_VAR')); // string '1'
var_dump(getenv('TEST_VAR')); // string 'else_branch'
また、SetEnv
とSetEnvIf
の両方を使用して、If/Elseの上のEARLY_VAR
に.htaccess
を設定してみました。常にElseブランチが実行されます。
どうしてこれなの?
Apache 2.4
式、つまり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
で機能します。
編集:
Apacheconfigまたはvhostconfigには、次の変数の初期化があります。
SetEnvIf Host ^ EARLY_VAR=5
次に、.htaccessで次のものを使用できます。
<If "env('EARLY_VAR') == '5'">
SetEnv TEST_VAR if_branch
</If>
<Else>
SetEnv TEST_VAR else_branch
</Else>
Apache/vhostconfigでenv変数宣言が必要な理由。同じ.htaccessに設定されたApache/vhostconfigおよびenv変数がif/else
式で評価できないために.htaccessがロードされるためです。
また、これらの変数をif/else
式で使用できるようにするには、SetEnvIf
ではなくSetEnv
を使用することが重要であることに注意してください。
SetEnv
ディレクティブ のドキュメントを見ると、次のことに気づきました。
内部環境変数を設定します。この変数は、Apache HTTPサーバーモジュールで使用でき、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の 環境変数wiki/docs ページにリストされている次の警告もあります。
SetEnv
ディレクティブはリクエスト処理中に遅れて実行されます。つまり、SetEnvIf
やRewriteCond
などのディレクティブはそれに設定された変数を認識しません。
私がそれを機能させる唯一の方法は、.conf
と.htaccess
の両方で SetEnvIf を使用することです。
.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が設定される前に評価されたようです)
Apache構成でSetEnvとSetEnvIfに問題が見つかった場合。
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>