无法检索PHP中的Apache环境变量
-
29-09-2019 - |
题
背景
我有一个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"));
好好享受。