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

Kar*_*rls 42 apache logging

如何在日志文件中记录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

但它不符合逻辑,不可能知道哪个标题.

Cra*_*yro 65

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> 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是正确的答案.以下是在httpd.conf中设置的方法.(呃,评论中没有换行符?)`LoadModule log_forensic_module/usr/lib64/httpd/modules/mod_log_forensic.so`` <IfModule log_forensic_module> ForensicLog/var/log/httpd/forensic_log </ IfModule>`现在你可以检查[Shellshock](http://www.troyhunt.com/2014/09/everything-you-need-to-know-about.html)尝试如此:`grep"(){"/ var/log/httpd/forensic_log` (14认同)
  • 注意,如果使用`a2enmod log_forensic`来启用模块,则不需要使用`LoadModule`行. (5认同)
  • 我喜欢使用LoadModule而不是a2enmod,因为它只能针对特定的虚拟主机激活,然后我可以注释掉该行并重新加载apache,一切都恢复正常! (2认同)
  • 在最新版本的 apache 中或取决于您的系统,mod 的路径可能是 `/usr/lib/apache2/modules/mod_log_forensic.so`,保存日志的典型文件夹将是 `${APACHE_LOG_DIR}/forensic。日志`。 (2认同)

Hub*_*ast 14

以下是所有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} i,其中foobar是标头的名称.因此,唯一的解决方案是创建特定的格式字符串.当你期望像x-my-nonstandard-header这样的非标准头文件时,请使用%{x-my-nonstandard-header}i.如果您的服务器要忽略这个非标准头,为什么要将它写入您的日志文件?未知的标题对您的系统完全没有影响.

  • 它仍然有用,能够记录传递到apache机器上的所有HTTP头.我希望有一个更灵活的系统,而不是每次引入新标头时都要编辑`LogFormat`. (3认同)

nor*_*man 6

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

例如,从脚本中运行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
Run Code Online (Sandbox Code Playgroud)

其中每个代表一个请求标头.

请注意,标头名称是从实际请求中修改的.例如,"Accept-Language"变为"HTTP_ACCEPT_LANGUAGE",依此类推.