Не удается получить переменные окружения Apache в PHP - PullRequest
6 голосов
/ 30 ноября 2010

Фон

У меня установлен 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 выводится значение bool (false), указывающее, что переменная не найдена!
Однако, если я перехожу на другую переменную среды Apache, такую ​​как HTTP_HOST, она работает.
... и да, я пробовал getenv() также, тот же результат.

Также есть примечание, что сервер Apache должен быть скомпилирован с APR 1.3.0 для работы. Я использовал сборку Apache msi из httpd.apache.org, и она, кажется, скомпилирована с APR выше версии 2. Поскольку я могу видеть их с phpinfo(), они должны быть доступны из PHP.

Ответы [ 4 ]

3 голосов
/ 30 ноября 2010

Я использовал это правило mod_rewrite в файле .htaccess, чтобы сделать переменную среды заголовка HTTP Authorization доступной в $_SERVER['HTTP_AUTHORIZATION']. Я уверен, что это может быть адаптировано для ваших целей. Не уверен, что это лучшее решение, но это a решение:

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
1 голос
/ 30 ноября 2010

Я сделал работу вокруг,

Кажется, это может быть ошибка PHP. Обнаружены некоторые связанные ошибки в PHP 4, и, возможно, они еще не исправили их ...

Я сделал решение, которое мне действительно не нравится (потому что я получаю доступ к таблице пользовательских данных Apache), но, похоже, у меня нет выбора.

//************************************************************* 
// 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.

Если кто-нибудь сможет привести какую-либо актуальную информацию по этой теме, я был бы рад ...

0 голосов
/ 04 ноября 2015

Недавно я написал библиотеку для получения значений из переменных окружения и анализа типов данных PHP. Эта библиотека может использоваться для анализа переменных среды в типах данных PHP (таких как приведение к целочисленному типу, float, null, boolean), синтаксического анализа сложных структур данных, таких как строка 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"));

Наслаждайся этим.

0 голосов
/ 01 марта 2011

В ответе Дечезе есть ключ.Он выбирает данные из $ _SERVER вместо $ _ENV.

Я устанавливал Apache Env Var с

SenEnv MY_VAR "true" в основном httpd.conf и не мог его увидетьв $ _ENV.Хотя это было в $ _SERVER.

...