2012-03-30 114 views
34

如何在日志文件中记录apache收到的HTTP请求标头(全部)的内容?是否可以使用Apache记录所有HTTP请求标头?

目前我的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

,但它是不符合逻辑的,它是不可能知道哪些头将是。

回答

10

这里是所有的HTTP报头的列表:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

这里是所有Apache的logformats的列表:http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats

当你没有写正确,用于记录一个特定头的代码是% {foobar}我在哪里foobar是标题的名称。所以,唯一的解决方案是创建一个特定的格式字符串。当你期望像x-my-nonstandard-header这样的非标准头部时,则使用%{x-my-nonstandard-header}i。如果你的服务器将忽略这个非标准头,你为什么要把它写到你的日志文件中?未知的标题对您的系统完全没有影响。

+3

能够记录传递到Apache机器上的所有HTTP头文件仍然非常有用。我宁愿有一个更灵活的系统,而不是每次引入新头时编辑'LogFormat'。 – 2014-06-13 16:08:15

+1

我特意登录为这个答案投票! – rofans91 2016-06-23 03:42:20

40

mod_log_forensic是你想要的,但默认情况下它可能不包含/可用于你的Apache安装。

以下是如何使用它。

LoadModule log_forensic_module /usr/lib64/httpd/modules/mod_log_forensic.so 
<IfModule log_forensic_module> 
ForensicLog /var/log/httpd/forensic_log 
</IfModule> 
+11

谢谢,这是正确的答案。以下是如何在httpd.conf中设置的方法。 (哎,在注释中没有换行符??) '的LoadModule log_forensic_module的/ usr/lib64下/ httpd的/模块/ mod_log_forensic.so' ' ForensicLog /无功/日志/ httpd的/ forensic_log' 现在你可以检查[Shellshock](http://www.troyhunt.com/2014/09/everything-you-need-to-know-about.html)尝试如此:'grep“(){”/ var/log /的httpd/forensic_log' – Raptor007 2014-09-25 19:44:07

5

如果您有兴趣观察其特定的头文件的远程客户端发送到服务器,并且可以导致运行CGI脚本的请求,那么最简单的解决办法是让你的服务器脚本转储环境变量到某个文件中。

例如运行shell命令 “ENV>的/ tmp /头” 从你的脚本中

然后,查找以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”,依此类推。

相关问题