2010-11-29 92 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(),我可以看到在「阿帕奇環境」這些變量與他正確的價值觀。

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

問題

我無法從我的PHP獲取這些環境變量。

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

第3行打印bool(false)表示找不到變量!
但是,如果我更改爲另一個Apache環境變量,如'HTTP_HOST',它就可以工作。
..和是的,我已經試過getenv()也,同樣的結果。

還有一個需要注意的是Apache服務器需要與APR 1.3.0編譯工作。我使用的是httpd.apache.org上的Apache msi版本,它似乎是用APR高於版本2編譯的。由於我可以用phpinfo()查看它們,因此它們必須可以從PHP訪問。

+2

* \ [注意:請參閱[修訂歷史](http://stackoverflow.com/posts/4308886/revisions)關於此評論的上下文。] *我們通常不會關注某人的英語(你的很漂亮好),如果你的代碼格式吸引了某人可能會編輯它,所以它很好讀。此外,SO不是人們被告知google/rtfm的地方 - googling/rtfming是人們回答可能會做的事情,因爲他們會得到+ rep,同時告訴您這樣做很可能會導致-rep。 :p – ThiefMaster 2010-11-29 23:04:16

+0

我對你的問題沒有任何答案,但是+1對於我所見過的最好的結構化問題。 – 2010-11-29 23:09:35

+0

完美有效的問題,不需要如此防守。 :) RTFM答案通常保留很多,*很*更糟(非)問題。 – deceze 2010-11-30 00:21:41

回答

1

我做了一個解決辦法,

看起來這可能是一個PHP錯誤。發現報道PHP 4的一些相關的錯誤,也許他們還沒有確定他們尚未...

我這樣做,我真的不喜歡(因爲我訪問了Apache用戶數據表)的解決方案,但似乎我沒有選擇。

//************************************************************* 
// 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變量,因此它可以被使用。 稍後當「bug」被修復時,它會自動使用原始的$ _ENV。

如果任何人都可以帶來一些了關於這一主題的最新信息,我會很高興......

3

我在.htaccess文件中使用這個的mod_rewrite規則,使在$_SERVER['HTTP_AUTHORIZATION']提供的HTTP Authorization頭環境變量。我相信這可以適應你的目的。不知道這是最好的解決方案,但它是一個解決

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

有一個在deceze的答案的線索。他從$ _SERVER獲取數據而不是$ _ENV。

我在主httpd.conf中設置的Apache的環境變量與

SenEnv MY_VAR「真」,不能看到它在$ _ENV。儘管它在$ _SERVER中。

0

最近我寫了一個庫來從環境變量中獲取值並解析爲PHP數據類型。該庫可用於將環境變量解析爲PHP數據類型(如轉換爲整型,浮點型,空值,布爾型),像JSON字符串一樣解析複雜的數據結構,以及通過社區貢獻。

庫,請訪問:https://github.com/jpcercal/environment

設置你的.htaccess與環境變量的例子:

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

而擺脫環境變量(環境獨立CLI,阿帕奇,Nginx的值,PHP內置服務器等)做到這一點:

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

享受它。