2013-06-12 22 views
9

.htaccessからPHPに環境変数を渡そうとしています。これは私のローカルWAMPサーバー上で正常に動作しますが、私のWebサイトがホストされているサーバーでは、理由がなく失敗します。環境変数が.htaccessからPHPに渡されない

は、ここに私のテスト構成です:

.htaccessファイル:

SetEnv TEST_VARIABLE test_value 

test.phpを:私のローカルサーバー上

<pre> 
getenv('TEST_VARIABLE') = <?php print getenv('TEST_VARIABLE'); ?> 

getenv('REDIRECT_TEST_VARIABLE') = <?php print getenv('REDIRECT_TEST_VARIABLE'); ?> 
</pre> 

、正しくtest.phpを得ることが返されます。

getenv('TEST_VARIABLE') = test_value 
getenv('REDIRECT_TEST_VARIABLE') = 

しかし、本番サーバー、それが返されます:私は除外しました

getenv('TEST_VARIABLE') = 
getenv('REDIRECT_TEST_VARIABLE') = 

もの:

  1. mod_envをホストでは有効になって/インストールされていません。できない。なぜなら、SetEnvは認識されず、.htaccessを処理しているうちに500を受け取るからだ。

  2. AllowOverrideshttpd.confにはFileInfoが含まれていません。できない。なぜなら、ApacheはSetEnv指示文に遭遇したときにApacheが "SetEnv not allowed here"というエラーをスローし、再び500を受け取るからです。

  3. variables_orderには 'E'が含まれていません。これは、$_ENVのスーパーグローバルが空であることを示していますが、getenv()はこれらの変数の値を返しません。

  4. すべての環境が不正です。 getenv('PATH')getenv('SERVER_NAME')は依然として有効な値を返すため、できません。

この時点で、どのような構成がこれを引き起こす可能性があるのか​​は分かりません。

答えて

6

setenvを使用すると、通常は.htaccessで動作しないと思います。シェルスクリプトコマンド(bash、Cシェルなど)です。サーバをサポートする場合は、https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gsによれば、変数名はHTTP_で始める必要があります。

+3

SetEnv _is_ .htaccessコマンドですが、あなたはそれを釘付けにしました。変数に接頭辞としてHTTP_を付けると、すべてが機能しました。私はその要件が "公式な"ソースに書かれているのを見たことがない。これは奇妙だが、もしうまくいけば、それに触れないのだろうか? – nitwit

+1

一部のサーバーでRewriteRule。* - (E = HTTP_VAR:VAL)と同じ要件が適用されるようです。 – Chris

+0

はちょうどこの同じ問題に遭遇したので、どこにも記載されていないというのは奇妙です。私の場合、これはPHPスクリプトではなくPerlで行われます。 – insaner

4

Macでホームサーバーを実行している場合やsuEXECが有効な場合、定義されている非http環境変数を削除するためのセキュリティ対策が用意されているため、$ _ENV ['APPLICATION_ENV' ]。ただし、同じことを得るために、ネイティブのPHP関数を使ってこれらにアクセスすることはできます。

$var = apache_getenv('APPLICATION_ENV'); 

この関数は、PHPが$ _ENV変数からこれらを削除した場合でも、あなたの.htaccessファイルでsetenvで定義されたすべての環境変数、またはphp.iniで設定されているすべての環境変数を取得します。

環境変数は、必要に応じてPHP内で定義できますが、お勧めできませんが、

$_ENV['APPLICATION_ENV'] = apache_getenv('APPLICATION_ENV'); 

あるいは、よりよい解決策は:ちょうど地球を定義します。あなたはそれを行うたら、必要に応じて

define('APPLICATION_ENV', apache_getenv('APPLICATION_ENV')); 

は、それが動作するはずです。

関連する問題