2010-08-02 10 views
9

Nella configurazione del registro Apache è possibile specificare che il nome utente dell'autorizzazione HTTP debba essere registrato. La maggior parte degli script PHP ha una propria autenticazione basata su cookie. È possibile in PHP fornire ad Apache un nome utente di autenticazione HTTP per la registrazione, anche se l'autenticazione è basata sui cookie? Se sì, come sarebbe il codice? Se no, quali sono le alternative?Metti il ​​nome utente in apache access_log con PHP e senza autenticazione HTTP

+0

I non pensare sia una buona idea Perché non usare un logfile separato? –

+1

Perché mi piacerebbe fare statistiche semplici con uno strumento come AWStats. – chiborg

risposta

11

Apache passa i dati tra i moduli nelle note . Se esegui PHP come modulo Apache, puoi utilizzare apache_note() per ottenere e impostare le note. È quindi possibile includere the %{note_name}n log format string per scrivere questo nel registro di accesso. Ciò non "ripulirà" alcun dato sul client.

In PHP:

apache_note('username', $username); 

Nella configurazione del server:

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

Una possibilità è di memorizzare i nomi utente & session_ids in passato da qualche altra parte, e lasciare che il log scriva i valori del cookie in esso (in genere %{PHPSESSID}C), che è possibile risalire.

Un'altra opzione sarebbe quella di inviare un colpo di testa con il nome utente al client, preferibilmente subito dopo l'session_start:

PHP:

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

CustomLog:

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

Breve utilizzando un gestore Apache per toccare le strutture di dati auth * interne, la soluzione migliore è ricorrere alle variabili di ambiente. Si potrebbe impostare una variabile di ambiente di alto livello utilizzando apache_setenv nel codice PHP

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

e quindi scrivere il valore nel file di registro con una voce LogFormat nella configurazione di Apache con "% {USERID} e" invece di " % 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 

Naturalmente, le vere credenziali quando svolgono effettiva autenticazione HTTP sarebbe perduto per sempre, in modo da considerare il risparmio% u da qualche altra parte - sia in un nuovo campo o in un file di log in parallelo.

+0

non sarebbe una variabile di ambiente essere globale e come tale essere inaffidabile –

+0

@Esben Non sono sicuro esattamente cosa intendi, ma in generale no - una variabile di ambiente non è globale. La soluzione di cui sopra funziona perfettamente per me. – rjmunro

7

Dal Apache 2.4.7 Apache consente di copiare una risposta-header a una nota. Quindi, se non si esegue PHP come un modulo Apache (ma per esempio si usa PHP-FPM), e non si vuole anche che il valore di log sia inviato al client (cosa che succederebbe di solito se lo si imposta in un risposta-header), ecco un modo per farlo:

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 
Problemi correlati