2012-03-30 110 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」,依此類推。

相關問題