No se pueden recuperar las variables de entorno de Apache en PHP
-
29-09-2019 - |
Pregunta
Fondo
Tengo un / 2.2.15 (Win32) con PHP / 5.3.2 establecido, la autenticación de manejo de Apache.
<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>
La autenticación funciona bien! No hay problemas.
Sin embargo, con respecto a la documentación , cualquier campo adicional de volver de la AuthDBDUserPWQuery será puesto en un AUTHENTICATION_fieldname variable en el entorno.
Con phpinfo()
, puedo ver estas variables con él valores correctos en "Apache Medio Ambiente".
AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS
Problema
No puede recuperar esas variables de entorno de mi php.
1 <?php
2 $Access = apache_getenv('AUTHENTICATE_ACCESS',true);
3 var_dump($Access);
4 ?>
Línea 3 impresiones bool (false) que indica que no se ha encontrado la variable
Sin embargo, si me cambio a otra variable Apache Medio Ambiente como 'HTTP_HOST' funciona.
..y sí, he intentado getenv()
también, mismo resultado.
También hay una nota que el servidor Apache necesita ser compilado con abril 1.3.0 al trabajo. He utilizado la acumulación de Apache MSI desde httpd.apache.org y parece ser compilado con abril por encima de la versión 2. Desde que se pueden ver a phpinfo()
deben ser accesibles desde PHP.
Solución 2
Me hizo un trabajo alrededor,
Parece que esto podría ser un error de PHP. Se han encontrado algunos errores relacionados comunicados para PHP 4 y tal vez no los han fijado todavía ...
Hice una solución que realmente no me gusta (porque estoy acceder a la tabla de datos de usuario de Apache), pero parece que no tengo otra opción.
//*************************************************************
// 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);
}
Si PHP no haya actualizado $ _ENV correcta, esto va a recuperar la corriente conectado usuario de la misma base de datos y la tabla que Apache está utilizando para la autenticación. A continuación, los campos adicionales se escriben en la variable global $ _ENV para que pueda ser utilizado como se supone. Más tarde, cuando se fija el "error", se utilizará automáticamente el original de $ _ENV.
Si alguien puede traer un poco de la información actualizada sobre este tema, yo sería feliz ...
Otros consejos
He utilizado esta regla mod_rewrite en un archivo .htaccess para que la variable de entorno cabecera HTTP de Autorización disponible en $_SERVER['HTTP_AUTHORIZATION']
. Estoy seguro de que esto podría ser adaptado para sus propósitos. No estoy seguro de si es la mejor solución, pero es de a Solución:
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
Hay una pista en la respuesta de deceze. Él es ir a buscar los datos de $ _SERVER en lugar de $ _ENV.
Yo estaba sentado un Apache Env Var con
SenEnv my_var "verdadero" en el httpd.conf principal y no podía verlo en $ _ENV. Fue en $ _SERVER sin embargo.
Hace poco escribí una biblioteca para obtener los valores de las variables de entorno y de análisis de los tipos de datos de PHP. Esta biblioteca se puede utilizar para variables de entorno de análisis sintáctico a tipos de datos de PHP (como la pieza de fundición a entero, flotante, null, boolean), analizar las estructuras de datos complejas, como una cadena JSON y más con la contribución del provecho de la comunidad.
La biblioteca está disponible aquí: https://github.com/jpcercal/environment
Configuración de las variables de entorno con .htaccess por ejemplo:
SetEnv YOUR_ENV_VARIABLE_NAME the-value-of-your-env-var
Y para obtener los valores de la variable de entorno (independientemente de la CLI medio ambiente, Apache, Nginx, PHP incorporada en el servidor y más) para hacerlo:
<?php
// ...
require "vendor/autoload.php";
// ...
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME"));
disfrutar de ella.