2010-11-29 41 views
6

背景

私はPHP/5.3.2でApache/2.2.15(Win32)をセットアップし、認証を処理しています。PHPでApache環境変数を取得できません。

<Directory /usr/www/myhost/private> 
    # core authentication and mod_auth_basic configuration 
    # for mod_authn_dbd 
    AuthType Basic 
    AuthName "My Server" 
    AuthBasicProvider dbd 

    # core authorization configuration 
    Require valid-user 

    # mod_authn_dbd SQL query to authenticate a user 
    AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s" 
</Directory> 

認証が正常に機能します。問題はありません。

しかしdocumentationにについては、余分なフィールドがAuthDBDUserPWQueryから戻っは、環境中AUTHENTICATION_fieldname変数に入れられます。

phpinfo()とすると、「Apache環境」で正しい値でこれらの変数を見ることができます。

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS私はPHPからこれらの環境変数を取得することはできません

問題。

1 <?php 
2 $Access = apache_getenv('AUTHENTICATE_ACCESS',true); 
3 var_dump($Access); 
4 ?> 

行3は、変数が見つからなかったことを示すbool(false)を出力します。
しかし、「HTTP_HOST」などの別のApache環境変数に変更すると動作します。
とはい、私は同じ結果をgetenv()も試しました。

ApacheサーバーをAPR 1.3.0でコンパイルする必要があるという注意もあります。私はhttpd.apache.orgのApache msiビルドを使いました。バージョン2の上にAPRを付けてコンパイルされているようです。phpinfo()でそれらを見ることができるので、PHPからアクセス可能でなければなりません。

+2

*このコメントの文脈については、[改訂履歴](http://stackoverflow.com/posts/4308886/revisions)を参照してください。] *私たちは通常、良い)とあなたのコードの書式が誰かを吸っておそらくそれを編集するので、それはよく読みやすいです。さらに、人々はgoogle/rtfmに語られる場所ではありません - グーグル/ rtfmingは、あなたがそうするように指示している間に+ repを取得するので、人々が答えるかもしれないものです。 :p – ThiefMaster

+0

私はあなたの質問に答えがありませんが、私はこれまでに見た中で最も構造化された質問を持っているため+1です。 –

+0

完全に有効な質問ですので、守る必要はありません。 :) RTFMの回答は通常、多くの、*多*悪い(非)質問のために予約されています。 – deceze

答えて

1

これはPHPのバグかもしれないように思えます。 PHP 4で報告されたいくつかの関連するバグを見つけましたが、まだそれらを修正していないかもしれません...

私はApacheのuserdataテーブルにアクセスしているので、私には選択肢がありません。 PHPが正しい$ _ENVを更新するために失敗した場合

//************************************************************* 
// If PHP failed to retrieve the AuthDBDUserPWQuery fields. 
// Connect to Apache authentication databaseand create the 
// envirnment variables manually 
// 
if (empty($_ENV['AUTHENTICATE_ACCESS'])) { 
    $Apache = mysql_connect('MyServerIP','MyUserName','MyPassword',false,MYSQL_CLIENT_SSL|MYSQL_CLIENT_COMPRESS); 
    mysql_select_db('MyDatabase',$Apache); 
    $SQLSet = mysql_query("SELECT Realm, Access FROM authenticationtable WHERE UserName='".$_SERVER['PHP_AUTH_USER']."' AND Password='".$_SERVER['PHP_AUTH_PW']."'"); 
    $SQLRow = mysql_fetch_array($SQLSet); 
    $_ENV['AUTHENTICATE_REALM'] = $SQLRow['Realm']; 
    $_ENV['AUTHENTICATE_ACCESS']= $SQLRow['Access']; 
    mysql_close($Apache); 
} 

が、これはApacheは認証のために使用しているのと同じデータベースやテーブルから現在ログインしているユーザーを検索します。 その後、余分なフィールドは、グローバル$ _ENV変数に書き込まれ、想定されたとおりに使用されます。 「バグ」が修正されると、元の$ _ENVが自動的に使用されます。

誰もがこのトピックに関する最新情報をいくつかを持ち出すことができれば、私は幸せになる... decezeの答えで手がかりは

+1

これはどうやって票決されるのですか?私は自分の質問への解決策を見つけ、他の人に見せるように投稿しました。あなたが投票に行くなら、なぜ?!? –

3

このmod_rewriteルールを.htaccessファイルで使用して、HTTP認証ヘッダー環境変数を$_SERVER['HTTP_AUTHORIZATION']で利用できるようにしました。私はこれがあなたの目的に合っていると確信しています。それが最善の解決策だが、それはソリューションですかどうかわからない:私は仕事の周りに作られた

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last] 
+0

+1試しに:Dあなたが提案したことを理解するためにRewriteRuleを読まなければなりませんでした。しかし、私はこれがうまくいくとは思わない。この権利を理解している場合、%{HTTP:Authorization}はすでにHTTPヘッダーに存在し、Apache環境にのみ情報を「コピー」します。私のケースでは、AuthDBDUserPWQueryは、SQL文からの余分なフィールド(パスワードの後ろ)ごとに "Apache環境"変数を作成します。これらの値はどこにも存在しません。これは、事前定義されたApache変数のみを取り出すことができるPHPのバグですか? –

+0

@Maxええと、私は見る...私は残念ながら、他に何も持っていません。 – deceze

0

があります。$ _ENVではなく$ _SERVERからデータを取得しています。

は私がメインのhttpd.confに

SenEnv MY_VAR "真" でのApacheのEnv Varの設定され、$ _ENVでそれを見ることができませんでした。それは$ _SERVERにあった。

0

最近、私は環境変数から値を取得し、PHPデータ型を解析するためのライブラリを作成しました。このライブラリを使用して、環境変数をPHPデータ型(integer、float、null、booleanへのキャストなど)に解析し、JSON文字列などの複雑なデータ構造を解析し、共同体の寄与分を解析することができます。

ライブラリがここにあります:https://github.com/jpcercal/environment

セットアップ例により、.htaccessファイルを使用して環境変数:

SetEnv YOUR_ENV_VARIABLE_NAME the-value-of-your-env-var 

と環境変数(独立した環境のCLIは、Apache、nginxのから値を取得するために、PHP組み込みサーバーなど):

<?php 
// ... 
require "vendor/autoload.php"; 
// ... 
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME")); 

お楽しみください。

関連する問題