2017-06-13 26 views
1

環境変数の存在に基づいて、Apache 2.4 <VirtualHost>に設定ファイルを含めることを試みています。環境変数に基づくApache VirtualHost条件

VirtualHost宣言の中では、私のようなVIEWMODE環境変数を設定:付属の設定ファイルの中に

Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf" 
<VirtualHost *:80> 
     SetEnv VIEWMODE demo 
     Include "${virtualhost_config}" 
</VirtualHost> 

を、私は今<Directory>ブロック内でこの条件を持っている:

<If "env('VIEWMODE') == 'demo'"> 
    RewriteRule (.*) http://www.apple.com/ [L,R=302] 
</If> 

しかし、私はこれを働かせるように見えない。条件付きRewriteRuleは無視されます。

私には何が欠けていますか?

+0

'' If'の中で 'Redirect 302" http://www.apple.com/ "'を使用してください。それ以外の場合は 'RewriteEngine On'がなければ動作しません。 – Deadooshka

答えて

0

documentation for SetEnvを参照してください:

最も早い要求処理ディレクティブは、アクセス制御とURIツーファイル名のマッピングとして、実行された後、このディレクティブによって設定された内部環境変数がに設定されています。設定している環境変数がRewriteRuleなどの処理の初期段階に入力されている場合は、代わりにSetEnvIfという環境変数を設定する必要があります。

とApache Expresionsドキュメントの機能セクション内note about environment variablesは関心のもある:環境変数が<If>条件内で検索されている

、それはだ

環境変数順序この解決策が発生する要求処理が非常に早い時期にどのように考慮することが重要です。指針として、仮想ホストコンテキスト(ディレクトリ、場所、htaccess)の外側に定義されたディレクティブは、実行する機会がまだありません。仮想ホストスコープ内SetEnvIfは、解像度は、一般的に後で発生するreqenv<If>の外で使用されるこの解像度

前に実行つのディレクティブであるが、正確なタイミングは、表現は内で使用されてきた指令に依存します。

は、だから、SetEnvIfSetEnvためには十分にすぐに処理されていない使用する必要がある、と私はここでテストしたとき、それは私のためにそれを修正しました。以下のようなもの:

Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf" 
<VirtualHost *:80> 
     SetEnvIf Request_URI^VIEWMODE=demo 
     Include "${virtualhost_config}" 
</VirtualHost> 
0

Iは次いでSetEnv指令並びに<If>ブロックの両方を供給Apacheの変数を設定することによって、これを解決しました。残念ながら、<If>ブロック自体は、の処理順序に問題が発生していたようです。ServerAlias not allowed here)ですが、<IfDefine>はこの問題がありませんでした。VIEWMODEはバイナリであるため<IfDefine>のみが機能しました。

Define environment production 
Define viewmode demo 

<VirtualHost *:80> 
    SetEnv ENVIRONMENT ${environment} 
    <IfDefine viewmode> 
     SetEnv VIEWMODE ${viewmode} 
     Include "${virtualhost_path}/conf/demo-configuration.conf" 
    </IfDefine> 
</VirtualHost> 

UnDefine environment 
UnDefine viewmode 

重要な注意点は、同じ変数が、その後の仮想ホストで使用される可能性がある場合、それぞれの終わりに彼らUnDefineに確認してくださいので、Apacheの変数は、グローバルであるということです。最終的な解決策は、このような何かを見てconfig。

関連する問題