Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用Apache记录所有HTTP请求头?_Apache_Logging - Fatal编程技术网

是否可以使用Apache记录所有HTTP请求头?

是否可以使用Apache记录所有HTTP请求头?,apache,logging,Apache,Logging,如何在日志文件中记录apache接收到的HTTP请求头(all)的内容 目前,我的apache组合日志格式配置为: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"" combined 我理解有可能这样做: LogFormat "%h %l %u %t \&

如何在日志文件中记录apache接收到的HTTP请求头(all)的内容

目前,我的apache组合日志格式配置为:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"" combined
我理解有可能这样做:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" \"%{heading name}i\" \"%{heading name}i\" \"%{heading name}i\"" combined

但这是不符合逻辑的,也不可能知道将使用哪些标头。

以下是所有http标头的列表:

下面是所有apache日志格式的列表:

正如您正确编写的那样,记录特定头的代码是%{foobar}i,其中foobar是头的名称。因此,唯一的解决方案是创建一个特定的格式字符串。当您需要像x-my-nonstandard-header这样的非标准头时,请使用
%{x-my-nonstandard-header}i
。如果您的服务器将忽略此非标准头,为什么要将其写入日志文件?未知标头对您的系统绝对没有影响。

是您想要的,但默认情况下,Apache安装可能不包含/不提供该标头

下面是如何使用它

LoadModule log_forensic_module /usr/lib64/httpd/modules/mod_log_forensic.so 
<IfModule log_forensic_module> 
ForensicLog /var/log/httpd/forensic_log 
</IfModule> 
LoadModule log\u法医学\u module/usr/lib64/httpd/modules/mod\u法医学.so
取证阻塞/var/log/httpd/forensicu日志

如果您有兴趣查看远程客户端发送到服务器的特定头,并且可以让请求运行CGI脚本,那么最简单的解决方案是让服务器脚本将环境变量转储到某个文件中

e、 g.在脚本中运行shell命令“env>/tmp/headers”

然后,查找以HTTP开头的环境变量

您将看到这样的行:

HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.5
HTTP_CACHE_CONTROL=max-age=0
每一个都代表一个请求头


请注意,标题名称是根据实际请求修改的。例如,“Accept Language”变成“HTTP_Accept_Language”,以此类推。

在我的例子中,获取浏览器标题的最简单方法是使用php。它将标题附加到文件并将其打印到测试页面

<?php
$fp = fopen('m:/temp/requests.txt', 'a');
$time = $_SERVER['REQUEST_TIME'];
fwrite($fp, $time + "\n");
echo "$time.<br>";
foreach (getallheaders() as $name => $value) {
    $cur_hd = "$name: $value\n";
    fwrite($fp, $cur_hd);
    echo "$cur_hd.<br>";
}
fwrite($fp, "***\n");
fclose($fp);
?>


它仍然非常有用,可以记录传递到apache机器上的所有HTTP头。我希望有一个更灵活的系统,而不是每次引入新的头时都必须编辑
LogFormat
。如链接文章中所述,服务器可能包括非标准的、自定义的、特定于应用程序的头。如果配置Apache的人不知道这些,那么这个解决方案将不会捕获它们。至于“未知标题对您的系统没有影响”,您不知道情况是否如此。任何数量的web框架都可能利用您意想不到的标题。谢谢,这是正确的答案。下面是如何在httpd.conf中设置它。(呃,评论中没有换行符???)现在你可以检查类似这样的尝试:
grep“(){”/var/log/httpd/forensic_log
注意,如果您使用
a2enmod log_forensic
来启用模块,您不需要使用
LoadModule
行。我喜欢使用LoadModule而不是a2enmod,因为它只能为特定的虚拟主机激活,然后我可以对该行进行注释并重新加载apache,一切都恢复正常L