PHPのApache環境変数を取得できません
-
29-09-2019 - |
質問
バックグラウンド
PHP/5.3.2をセットアップし、認証を処理するApache/2.2.15(Win32)があります。
<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>
認証は正常に機能します!問題はありません。
しかし、 ドキュメンテーション, 、authdbduserpwqueryから戻ってきた余分なフィールドは authentication_fieldname 環境の変数。
と phpinfo()
, 、「Apache Environment」の下で彼が正しい値であるこれらの変数を見ることができます。
Authenticate_username
Authenticate_Realm
Authenticate_access
問題
PHPからこれらの環境変数を取得することはできません。
1 <?php
2 $Access = apache_getenv('AUTHENTICATE_ACCESS',true);
3 var_dump($Access);
4 ?>
行3は、変数が見つからなかったことを示すブール(false)を印刷します!
ただし、「http_host」などの別のApache環境変数に変更すると、動作します。
..そして、はい、私は試しました getenv()
また、同じ結果。
また、Apacheサーバーを4月1.3.0でコンパイルする必要があるというメモもあります。 httpd.apache.orgからApache MSIビルドを使用しましたが、バージョン2を上回るAPRでコンパイルされているようです。 phpinfo()
PHPからアクセスできる必要があります。
解決 2
私は回避しました、
これはPHPバグかもしれないようです。 PHP 4に報告されているいくつかの関連バグが見つかりましたが、おそらくそれらはまだ修正していません...
私は本当に好きではないソリューションをしました(Apache userDataテーブルにアクセスしているため)が、選択肢がないようです。
//*************************************************************
// 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);
}
PHPが$ _ENVを正しく更新できなかった場合、これにより、Apacheが認証に使用している同じデータベースとテーブルから現在のログインしているユーザーが取得されます。その後、追加フィールドはグローバル$ _ENV変数に書き込まれるため、想定どおりに使用できます。 「バグ」が修正されると、元の$ _ENVが自動的に使用されます。
誰かがこのトピックに関する最新情報を提供できるなら、私は幸せになるでしょう...
他のヒント
このmod_rewriteルールを.htaccessファイルで使用して、HTTP Authorizationヘッダー環境変数をで利用できるようにしました $_SERVER['HTTP_AUTHORIZATION']
. 。これはあなたの目的のために適応できると確信しています。それが最良の解決策かどうかはわかりませんが、それは a 解決:
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
Decezeの答えには手がかりがあります。彼は$ _ENVの代わりに$ _Serverからデータを取得しています。
私はApache env varを設定していました
senenv my_var "true" in the main httpd.confでは、$ _envで見ることができませんでした。ただし、$ _Serverでした。
最近、環境変数から値を取得し、PHPデータ型に解析するライブラリを書きました。このライブラリを使用して、環境変数をPHPデータ型(整数、フロート、ヌル、ブールンへのキャスティングなど)に解析し、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"));
楽しめ。