在Apache日志配置中,可以指定应记录HTTP身份验证用户名。大多数PHP脚本都有自己的基于cookie的身份验证。是否有可能在PHP中为Apache提供HTTP auth用户名以进行日志记录,即使身份验证是基于cookie的?如果是,代码将如何?如果没有,有什么替代方案?
答案 0 :(得分:12)
Apache在 notes 中的模块之间传递数据。如果您将PHP作为Apache模块运行,则可以使用apache_note()
来获取和设置注释。然后,您可以包含the %{note_name}n
log format string将其写入访问日志。这不会将任何数据“泄漏”回客户端。
在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
答案 1 :(得分:7)
由于Apache 2.4.7 Apache允许您将响应标头复制到注释中。因此,如果您不将PHP作为Apache模块运行(但是例如使用PHP-FPM),并且您也不希望将日志值发送到客户端(如果您通常会发生这种情况)将它设置在响应标题中,这是一种方法:
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
答案 2 :(得分:2)
可能存储用户名&过去其他地方的session_ids,并让日志在其中写入cookie值(通常为%{PHPSESSID}C
),然后您可以追溯到该值。
另一种选择是将带有用户名的标题发送回客户端,最好是在session_start
之后:
PHP:
header('X-Php-Sess-User: '.$username);
的CustomLog:
%{X-Php-Sess-User}o
答案 3 :(得分:0)
如果不使用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保存在其他位置 - 无论是在新字段还是在并行日志文件中。
答案 4 :(得分:0)
我第二个“拖”回答
header('X-Username: '.$username);
我虽然会添加使我的配置工作的原因。
CustomLog logs/vhost-access_log logfmtname
# copy response-header value to note
Header always note X-Username username
# unset response-header so client won't get it
Header always unset X-Username