Apache log yapılandırmasında HTTP auth kullanıcı adının günlüğe kaydedilmesi gerektiğini belirtmek mümkün. Çoğu PHP betiğinin kendi tanımlama bilgisi tabanlı kimlik doğrulaması vardır. Kimlik doğrulama çerez tabanlı olsa bile, PHP'nin Apache'ye günlüğe kaydetme amacıyla HTTP auth kullanıcı adı sağlaması mümkün mü? Eğer evet ise, kod nasıl görünür? Yoksa, alternatifler nelerdir?PHP ile apache access_log'da kullanıcı adı ve HTTP auth olmadan
cevap
Apache, notları arasındaki verileri notları arasında geçirir. PHP'yi bir Apache modülü olarak çalıştırırsanız, not almak ve ayarlamak için apache_note()
'u kullanabilirsiniz. Daha sonra bunu erişim günlüğüne yazmak için the %{note_name}n
log format string'u ekleyebilirsiniz. Bu, herhangi bir veriyi müşteriye geri "sızmayacak". PHP
:
apache_note('username', $username);
sunucu yapılandırmasında:
Apaçi bir nota bir tepki-header kopyalamaya yarayan Apache 2.4.7 yanaLogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username
CustomLog logs/access_log common_with_php_username
& kullanıcı adlarını başka bir yerde oturum_aksesleri saklamak ve günlüğün içine tanımlama bilgilerini (genellikle %{PHPSESSID}C
) yazıp sonra izini geri bırakabilmeniz mümkün.
Başka bir seçenek en iyisi adet session_start
sonra müşteriye geri kullanıcı adıyla bir başlık göndermek olacaktır:
PHP:
header('X-Php-Sess-User: '.$username);
CustomLog: ait
%{X-Php-Sess-User}o
Kısa Bir Apache işleyicisini kullanarak, iç veri * veri yapılarına dokunmak için en iyi seçim, çevre değişkenlerine başvurmaktır. Eğer PHP kodu
apache_setenv('USERID','jrodriguez',true);
yılında apache_setenv kullanarak bir üst düzey ortam değişkeni ayarlamak ve sonra " "% {USERID} e" kullanarak yerine Apache yapılandırmasında LogFormat girişi ile günlük dosyasına değerini yazardı % u" elbette
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
, fiili HTTP auth gerçekleştiren gerçek kimlik bilgileri sonsuza kadar kayıp olacağını, bu yüzden u başka bir yere tasarrufu% düşünün - yeni bir alanda veya bir paralel günlük dosyasında ya.
bir ortam değişkeni global olamaz ve bu nedenle güvenilir olamaz –
@Esben Tam olarak ne demek istediğinizden emin değilsiniz, ancak genel olarak, hiç bir değişim değişkeni global değildir. Yukarıdaki çözüm benim için mükemmel çalışıyor. – rjmunro
. Eğer PHP'yi bir Apache modülü olarak kullanmıyorsanız (örneğin PHP-FPM'yi kullanıyorsanız) ve aynı zamanda günlük değerinin istemciye gönderilmesini istemiyorsanız (eğer bunu bir
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
ben tepkisi-header), burada bunu yapmak için bir yoldur Bunun iyi bir fikir olduğunu düşünmeyin. Neden ayrı bir günlük dosyası kullanmıyorsunuz? –
Çünkü AWStats gibi bir araçla basit istatistikler yapmak istiyorum. – chiborg