2010-08-02 12 views
9

En la configuración de registro de Apache, es posible especificar que se debe registrar el nombre de usuario de autenticación HTTP. La mayoría de los scripts PHP tienen su propia autenticación basada en cookies. ¿Es posible en PHP proporcionar a Apache un nombre de usuario de autenticación HTTP para fines de registro, incluso si la autenticación está basada en cookies? En caso afirmativo, ¿cómo se vería el código? Si no, ¿qué son alternativas?Poner nombre de usuario en apache access_log con PHP y sin autenticación HTTP

+0

I no pienses que es una buena idea ¿Por qué no usar un archivo de registro por separado? –

+1

Porque me gustaría hacer estadísticas simples con una herramienta como AWStats. – chiborg

Respuesta

11

Apache pasa datos entre módulos en notas. Si ejecuta PHP como un módulo de Apache, puede usar apache_note() para obtener y establecer notas. Puede incluir the %{note_name}n log format string para escribir esto en el registro de acceso. Esto no "filtrará" ningún dato al cliente.

En PHP:

apache_note('username', $username); 

En la configuración del servidor:

LogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username 
CustomLog logs/access_log common_with_php_username 
2

Una posibilidad es almacenar los nombres de usuario & pasado session_ids en otro lugar, y dejar que el registro escriba los valores de las cookies en él (normalmente %{PHPSESSID}C), que luego puede rastrear.

Otra opción sería enviar un encabezado con el nombre de usuario de vuelta al cliente, preferiblemente después de su session_start:

PHP:

header('X-Php-Sess-User: '.$username); 

CustomLog:

%{X-Php-Sess-User}o 
0

corto de usando un manejador de Apache para tocar las estructuras internas de datos auth *, tu mejor opción es recurrir a variables de entorno. Se podría establecer una variable de entorno de alto nivel utilizando apache_setenv en su código PHP

apache_setenv('USERID','jrodriguez',true); 

y luego escribir el valor en el archivo de registro con una entrada LogFormat en su configuración de Apache utilizando "% {USERID} e" en lugar de " % u"

LogFormat "%v:%p %h %l %{USERID}e %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" envuid_combined 
CustomLog /path/to/access.log envuid_combined 

por supuesto, las credenciales reales al realizar real de autenticación HTTP se perdería para siempre, por lo que considerar el ahorro% u otro lugar - ya sea en un nuevo campo o en un archivo de registro paralelo.

+0

no sería una variable de entorno global y, como tal, no confiable –

+0

@Esben No estoy seguro exactamente de lo que quiere decir, pero en general, no - una variable de entorno no es global. La solución anterior funciona perfectamente para mí. – rjmunro

7

Dado que Apache 2.4.7 Apache le permite copiar una respuesta de cabecera de una nota. Por lo tanto, si no ejecuta PHP como un módulo de Apache (pero, por ejemplo, usa PHP-FPM), y tampoco desea que el valor de registro se envíe al cliente (lo que normalmente sucedería si lo configurara en un respuesta de cabecera), aquí hay una manera de hacerlo:

php:

header('X-Username: '.$username); 

httpd.conf:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{username}n\"" logfmtname 

vhost.conf:

CustomLog logs/vhost-access_log logfmtname 

# copy response-header value to note 
Header note X-Username username 
# unset response-header so client won't get it 
Header unset X-Username 
Cuestiones relacionadas