无法在PHP中检索Apache环境变量

时间:2010-11-29 22:48:54

标签: php apache environment-variables authentication getenv

背景

我有一个Apache / 2.2.15(Win32),设置了PHP / 5.3.2,处理身份验证。

<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 Environment”下看到这些变量和正确的值。

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构建,它似乎是用版本2以上的APR编译的。因为我可以用phpinfo()看到它们,所以它们必须可以从PHP访问。

4 个答案:

答案 0 :(得分:3)

我在.htaccess文件中使用了这个mod_rewrite规则,以便在$_SERVER['HTTP_AUTHORIZATION']中提供HTTP Authorization标头环境变量。我相信这可以适应你的目的。不确定它是否是最佳解决方案,但它是 解决方案:

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

答案 1 :(得分:1)

我做了一个工作,

看起来这可能是一个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变量,以便可以按原样使用它。 之后当“bug”被修复时,它将自动使用原始的$ _ENV。

如果有人能提供有关此主题的最新信息,我会很高兴...

答案 2 :(得分:0)

deceze的回答有一个线索。他从$ _SERVER而不是$ _ENV获取数据。

我用

设置了一个Apache Env Var

主httpd.conf中的SenEnv MY_VAR“true”并且在$ _ENV中看不到它。它虽然在$ _SERVER中。

答案 3 :(得分:0)

最近我写了一个库来从环境变量中获取值并解析为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"));

享受它。