2010-08-02 1 views
9

Dans la configuration du journal Apache, il est possible de spécifier que le nom d'utilisateur d'authentification HTTP doit être enregistré. La plupart des scripts PHP ont leur propre authentification basée sur les cookies. Est-il possible en PHP de fournir à Apache un nom d'utilisateur HTTP à des fins de journalisation, même si l'authentification est basée sur un cookie? Si oui, à quoi ressemblerait le code? Si non, quelles sont les alternatives?Mettre le nom d'utilisateur dans apache access_log avec PHP et sans authentification HTTP

+0

I ne pense pas que c'est une bonne idée. Pourquoi ne pas utiliser un fichier journal séparé? –

+1

Parce que je voudrais faire des statistiques simples avec un outil comme AWStats. – chiborg

Répondre

11

Apache transmet les données entre les modules en note. Si vous exécutez PHP en tant que module Apache, vous pouvez utiliser apache_note() pour obtenir et définir des notes. Vous pouvez ensuite inclure the %{note_name}n log format string pour l'écrire dans le journal d'accès. Cela ne "fuira" aucune donnée au client.

En PHP:

apache_note('username', $username); 

Dans la configuration de votre serveur:

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

Il est possible de stocker les noms d'utilisateur & après session_ids ailleurs et de laisser le journal y écrire les valeurs de cookie (généralement %{PHPSESSID}C), que vous pouvez ensuite retracer.

Une autre option serait d'envoyer un en-tête avec le nom d'utilisateur au client, de préférence juste après votre session_start:

PHP:

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

CustomLog:

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

Court de en utilisant un gestionnaire Apache pour toucher les structures de données auth * internes, le mieux est de recourir à des variables d'environnement. Vous définissez une variable d'environnement de haut niveau à l'aide apache_setenv dans votre code PHP

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

puis écrire la valeur dans le fichier journal avec une entrée LogFormat dans votre configuration d'Apache en utilisant « % {USERID} e » au lieu 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 

Bien sûr, les véritables lettres de créance lors de l'exécution auth réelle HTTP serait perdu pour toujours, alors pensez à économiser% u quelque part ailleurs - soit dans un nouveau domaine ou dans un fichier journal parallèle.

+0

ne serait pas une variable d'environnement globale et en tant que telle ne pas être fiable –

+0

@Esben Vous ne savez pas exactement ce que vous voulez dire, mais en général, non - une variable envorioment n'est pas globale. La solution ci-dessus fonctionne parfaitement pour moi. – rjmunro

7

Depuis Apache 2.4.7 Apache vous permet de copier une-tête de réponse à une note. Donc, si vous n'exécutez pas PHP en tant que module Apache (mais utilisez par exemple PHP-FPM), vous ne voulez pas non plus que la valeur du journal soit envoyée au client (ce qui arrive généralement si vous le définissez dans un -tête de réponse), voici une façon de le faire:

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 
Questions connexes