2010-11-29 10 views
6

Antecedentes

tengo un Apache/2.2.15 (Win32) con PHP/5.3.2 configurado, la autenticación de la manipulación.no puede recuperar las variables de entorno de Apache en PHP

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

Pero con respecto a la documentation, cualquier campo adicional de regresar de la AuthDBDUserPWQuery será puesto en una variable deAUTHENTICATION_fieldname en el medio ambiente.

Con phpinfo(), puedo ver estas variables con los valores correctos en "Apache Environment".

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

Problema

no puedo ir a buscar esas variables de entorno de mi php.

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

La línea 3 imprime bool (falso) indicando que no se ha encontrado la variable.
Sin embargo, si cambio a otra variable de Apache Environment como 'HTTP_HOST', funciona.
..y sí, he intentado getenv() también, el mismo resultado.

También hay una nota que el servidor Apache necesita compilarse con APR 1.3.0 para funcionar. Utilicé la compilación de Apache msi desde httpd.apache.org y parece compilarse con APR sobre la versión 2. Como puedo verlos con phpinfo(), deben poder acceder desde PHP.

+2

* \ [♦ nota: Ver [historial de revisiones] (http://stackoverflow.com/posts/4308886/revisions) para el contexto de este comentario.] * Usualmente no llamamos sobre el inglés de alguien (el tuyo es bonito bueno) y si el formato de tu código le hubiera chupado a alguien, probablemente lo editaría para que sea fácil de leer. Además, SO no es el lugar donde se les dice a las personas a google/rtfm - googleando/rtfm es lo que las personas que responden pueden hacer, ya que obtendrán + rep por ello mientras le dicen que lo haga, lo más probable es que produzca -rep. : p – ThiefMaster

+0

No tengo ninguna respuesta a su pregunta, pero +1 por tener la mejor pregunta estructurada que he visto en SO. –

+0

Pregunta perfectamente válida, no hay necesidad de estar tan a la defensiva. :) Las respuestas RTFM generalmente se reservan para muchas, * mucho * peores (no) preguntas. – deceze

Respuesta

1

Hice un trabajo alrededor,

Parece que esto podría ser un error de PHP. Encontré algunos errores relacionados reportados para PHP 4 y quizás todavía no los han solucionado ...

Hice una solución que realmente no me gusta (porque estoy accediendo a la tabla de datos de usuario de Apache), pero parece que no tengo elecció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 el actual usuario conectado desde la misma base de datos y la tabla que Apache está utilizando para la autenticación. A continuación, los campos adicionales se escribirán en la variable $ _ENV global para que pueda usarse tal como se supone. Más tarde, cuando se corrige el "error", utilizará automáticamente el $ _ENV original.

Si alguien puede traer un poco de la información actualizada sobre este tema, yo sería feliz ...

+1

¿Y cómo se puede eliminar esto? Encontré una solución a mi propia pregunta y la publiqué para que otros puedan verla. Si va a votar abajo, por favor diga por qué?!? –

3

He utilizado esta regla mod_rewrite en un archivo .htaccess para hacer que la variable de entorno del encabezado Autorización HTTP esté disponible en $_SERVER['HTTP_AUTHORIZATION']. Estoy seguro de que esto podría adaptarse para sus propósitos. No estoy seguro de si es la mejor solución, pero es una solución :

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

+1 por intentar: D Tuve que leer en RewriteRule para entender lo que sugeriste. Pero no creo que esto funcione. Si entiendo este derecho% {HTTP: Authorization} ya está presente en su encabezado HTTP y solo "copia" la información en el entorno Apache. En mi caso, AuthDBDUserPWQuery crea variables de "entorno Apache" para cada campo adicional (después de la contraseña) de la declaración SQL. Estos valores no están presentes en ningún otro lado. ¿Puede ser esto un error en PHP que solo se pueden recuperar variables de Apache predefinidas? –

+0

@Max Hmm, ya veo ... no tengo nada más, desafortunadamente. – deceze

0

No es una pista en la respuesta de deceze.Está buscando los datos de $ _SERVER en lugar de $ _ENV.

me estaba poniendo un Apache Env Var con

SenEnv my_var "verdadero" en el httpd.conf principal y no podía verlo en $ _ENV. Sin embargo, fue en $ _SERVER.

0

Recientemente escribí una biblioteca para obtener valores de las variables de entorno y analizar los tipos de datos de PHP. Esta biblioteca se puede utilizar para analizar variables de entorno a tipos de datos de PHP (como la conversión a entero, flotante, nulo, booleano), analizar las complejas estructuras de datos como una cadena JSON y más con la contribución de la comunidad.

La biblioteca está disponible aquí: https://github.com/jpcercal/environment

de configuración con las variables de entorno .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 del entorno CLI, Apache, Nginx , PHP Built-in Server y más) para hacerlo:

<?php 
// ... 
require "vendor/autoload.php"; 
// ... 
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME")); 

Disfrútalo.

Cuestiones relacionadas