背景

我有一个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获取这些环境变量。

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

第3行打印布尔(false),指示未找到变量!
但是,如果我更改为另一个Apache环境变量,例如“ HTTP_HOST”,则可以正常工作。
..是的,我尝试了 getenv() 另外,结果相同。

还有一个注意到,Apache服务器需要使用Apr 1.3.0进行编译。我从httpd.apache.org使用了Apache MSI构建,它似乎已与APR上述版本一起编译。因为我可以看到它们 phpinfo() 必须从PHP访问它们。

有帮助吗?

解决方案 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变量中,以便可以按照预期使用。稍后,当修复“错误”时,它将自动使用原始$ _env。

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

其他提示

我在.htaccess文件中使用了此mod_rewrite规则,以使HTTP授权标头环境变量可在 $_SERVER['HTTP_AUTHORIZATION']. 。我敢肯定,这可能是为了您的目的。不确定它是否是最好的解决方案,但这是 一种 解决方案:

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

欺骗的回答有一个线索。他正在从$ _server而不是$ _env获取数据。

我正在设置一个apache env var

senenv my_var“ true”在主httpd.conf中,在$ _env中看不到它。虽然是$ _server。

最近,我编写了一个库,以获取从环境变量并解析到PHP数据类型的值。该库可用于将环境变量解析为PHP数据类型(例如铸造到整数,浮点,null,布尔值),分析复杂的数据结构(如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"));

好好享受。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top