簡體   English   中英

是否可以使用 Apache 記錄所有 HTTP 請求標頭?

[英]Is it possible to log all HTTP request headers with Apache?

如何將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 /var/log/httpd/forensic_log 
</IfModule> 

這是所有 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。 它將標題附加到文件並將它們打印到測試頁。

<?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);
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM