6

背景

我有一个 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>

身份验证工作正常!没问题。

但是关于文档,从 AuthDBDUserPWQuery 返回的任何额外字段都将放入环境中的AUTHENTICATION_fieldname变量中。

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

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

问题

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

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

4 回答 4

3

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

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
于 2010-11-30T00:19:39.507 回答
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 变量,以便可以按预期使用它。稍后当“bug”修复时,它会自动使用原来的$_ENV。

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

于 2010-11-30T02:23:57.797 回答
0

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

我正在设置一个 Apache Env Var

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

于 2011-03-01T20:54:20.737 回答
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"));

好好享受。

于 2015-11-04T20:58:13.140 回答