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

时间:2012-03-30 17:54:52

标签: 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

但它不符合逻辑,无法知道哪些标题。

4 个答案:

答案 0 :(得分:60)

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> 

答案 1 :(得分:13)

以下是所有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。如果您的服务器要忽略这个非标准头,为什么要将它写入您的日志文件?未知的标题对您的系统完全没有影响。

答案 2 :(得分:6)

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

e.g。运行shell命令&#34; env&gt;的/ tmp /报头&#34;来自你的剧本

然后,查找以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

每个代表一个请求标题。

请注意,标题名称是从实际请求中修改的。例如,&#34; Accept-Language&#34;成为&#34; HTTP_ACCEPT_LANGUAGE&#34;等等。

答案 3 :(得分:0)

就我而言,获取浏览器标头的最简单方法是使用php。它将标头附加到文件,并将其打印到测试页。

export default function App() {

  return (
    <NavigationContainer>
      <Drawer.Navigator>
        <Drawer.Screen name="Dashboard" component={Dashboard} />
        <Drawer.Screen name="Settings" component={SettingsScreen} />
      </Drawer.Navigator>
    </NavigationContainer>
  );
}