[英]Put username in apache access_log with PHP and without HTTP auth
在Apache日志配置中,可以指定應記錄HTTP身份驗證用戶名。 大多數PHP腳本都有自己的基於cookie的身份驗證。 是否有可能在PHP中為Apache提供HTTP auth用戶名以進行日志記錄,即使身份驗證是基於cookie的? 如果是,代碼將如何? 如果沒有,有什么替代方案?
Apache在注釋中的模塊之間傳遞數據。 如果您將PHP作為Apache模塊運行,則可以使用apache_note()
來獲取和設置注釋。 然后,您可以包含%{note_name}n
日志格式字符串,以將其寫入訪問日志。 這不會將任何數據“泄漏”回客戶端。
在PHP中:
apache_note( 'username', $username );
在您的服務器配置中:
LogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username
CustomLog logs/access_log common_with_php_username
由於Apache 2.4.7 Apache允許您將響應標頭復制到注釋中。 因此,如果您不將PHP作為Apache模塊運行(但是例如使用PHP-FPM),並且您也不希望將日志值發送到客戶端(如果您將其設置為response-header),這是一種方法:
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
一種可能性是將用戶名和過去的session_ids存儲在其他地方,並讓日志在其中寫入cookie值(通常為%{PHPSESSID}C
),然后您可以追溯到該值。
另一種選擇是將帶有用戶名的標題發送回客戶端,最好是在session_start
:
PHP:
header('X-Php-Sess-User: '.$username);
的CustomLog:
%{X-Php-Sess-User}o
如果不使用Apache處理程序來觸及內部auth *數據結構,最好的辦法是求助於環境變量。 您可以在PHP代碼中使用apache_setenv設置頂級環境變量
apache_setenv('USERID','jrodriguez',true);
然后使用“%{USERID} e”而不是“%u”將值寫入Apache配置中的LogFormat條目的日志文件中
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
當然,執行實際 HTTP身份驗證時的真實憑據將永遠丟失,因此請考慮將%u保存在其他位置 - 無論是在新字段還是在並行日志文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.