2010-11-29 88 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")); 

享受它。