如何将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
但这不符合逻辑,并且不可能知道哪些标头将是。
mod_log_forensic 是您想要的,但默认情况下它可能不会包含在您的 Apache 安装中/不可用。
以下是如何使用它。
LoadModule log_forensic_module /usr/lib64/httpd/modules/mod_log_forensic.so
<IfModule log_forensic_module>
ForensicLog ${APACHE_LOG_DIR}/forensic.log
</IfModule>
注意:您的路径可能会有所不同,例如
/usr/lib/apache2/modules/mod_log_forensic.so
这里是所有 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
。如果您的服务器要忽略这个非标准标头,为什么要将其写入日志文件?未知的标头对您的系统绝对没有影响。
如果您有兴趣查看远程客户端发送到您的服务器的特定标头,并且您可以使请求运行 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
每一个都代表一个请求标头。
请注意,标头名称是根据实际请求修改的。例如,“Accept-Language”变为“HTTP_ACCEPT_LANGUAGE”,依此类推。
就我而言,获取浏览器标头的最简单方法是使用 php.ini。它将标题附加到文件并将其打印到测试页。
<?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);
?>
我认为最简单的方法是使用内部带有 phpinfo() 函数的 php 文件:
<?php
phpinfo();