web-dev-qa-db-ja.com

htaccess If ... Elseは常にElseを選択します

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'

また、SetEnvSetEnvIfの両方を使用して、If/Elseの上のEARLY_VAR.htaccessを設定してみました。常にElseブランチが実行されます。

どうしてこれなの?

Apache 2.4

16
BeetleJuice

式、つまり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を使用することが重要であることに注意してください。

7
anubhava

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ディレクティブはリクエスト処理中に遅れて実行されます。つまり、SetEnvIfRewriteCondなどのディレクティブはそれに設定された変数を認識しません。

5
hjpotter92

私がそれを機能させる唯一の方法は、.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が設定される前に評価されたようです)

1
Dusan Bajic

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