首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法检索PHP中的Apache环境变量

问无法检索PHP中的Apache环境变量
EN

Stack Overflow用户
提问于 2010-11-29 22:48:53
回答 4查看 3.9K关注 0票数 6

背景

我有一个带有PHP5.3.2的Apache2.2.15 (Win32),用于处理身份验证。

代码语言:javascript
复制
<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>

认证工作正常!没问题。

但是对于AUTHENTICATION_fieldname,任何从AuthDBDUserPWQuery返回的额外字段都将被放入环境中的一个AuthDBDUserPWQuery变量中。

使用phpinfo(),我可以在"Apache“下看到这些变量的正确值。

AUTHENTICATE_USERNAME

AUTHENTICATE_REALM

AUTHENTICATE_ACCESS

问题

我无法从我的php中获取这些环境变量。

代码语言:javascript
复制
1 <?php
2   $Access = apache_getenv('AUTHENTICATE_ACCESS',true);
3   var_dump($Access);
4 ?>

第3行打印bool(false),指示没有找到变量!

但是,如果我更改为另一个变量(如'HTTP_HOST‘),它就能工作。

..and是的,我也尝试过getenv(),同样的结果。

还有一点值得注意的是,Apache服务器需要用APR1.3.0编译才能工作。我使用了从httpd.apache.org构建的Apache,它似乎是用版本2上面的APR编译的,因为我可以用phpinfo()看到它们,所以它们必须可以从phpinfo()中访问。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-30 02:23:57

我做了一件事,

看起来这可能是一个PHP错误。在PHP 4中发现了一些相关的bug,也许它们还没有修复.

我做了一个我真的不喜欢的解决方案(因为我正在访问Apache用户数据表),但是我似乎别无选择。

代码语言:javascript
复制
//************************************************************* 
// 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。

如果有人能提供一些关于这个话题的最新信息,我会很高兴.

票数 2
EN

Stack Overflow用户

发布于 2010-11-30 00:19:39

我在一个mod_rewrite文件中使用了这个.htaccess规则来使环境变量在$_SERVER['HTTP_AUTHORIZATION']中可用。我相信这能适应你的目的。不确定这是否是最好的解决方案,但它是一个解决方案:

代码语言:javascript
复制
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
票数 3
EN

Stack Overflow用户

发布于 2011-03-01 20:54:20

欺骗的答案是有线索的。他从$_SERVER而不是$_ENV获取数据。

我正在设置一个Apache

SenEnv MY_VAR在主httpd.conf中“真”,在$_ENV中看不到它。不过是在$_SERVER。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4308886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档