2010-08-02 30 views
9

在Apache日誌配置中,可以指定應該記錄HTTP驗證用戶名。大多數PHP腳本都有自己的基於cookie的認證。即使身份驗證是基於cookie的,是否可以在PHP中爲Apache提供用於登錄目的的HTTP身份驗證用戶名?如果是,代碼將如何?如果不是,有什麼替代方案?將用戶名放入apache access_log中,並且不使用HTTP驗證

+0

我不要認爲這是個好主意。爲什麼不使用單獨的日誌文件? – 2010-08-02 15:26:43

+1

因爲我想用AWStats這樣的工具做簡單的統計。 – chiborg 2010-08-02 15:35:38

回答

11

Apache在筆記模塊之間傳遞數據。如果您將PHP作爲Apache模塊運行,則可以使用apache_note()來獲取和設置筆記。然後可以包含the %{note_name}n log format string將其寫入訪問日誌。這不會將任何數據「泄露」回客戶端。

在PHP:

apache_note('username', $username); 

在您的服務器配置:

LogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username 
CustomLog logs/access_log common_with_php_username 
2

一種可能性是將用戶名&存儲在其他地方的session_ids之後,並讓日誌在其中存儲cookie值(通常爲%{PHPSESSID}C),然後可以追溯到該值。

另一種選擇是與用戶名發送頭回客戶端,您session_start後最好立即:

PHP:

header('X-Php-Sess-User: '.$username); 

的CustomLog:

%{X-Php-Sess-User}o 
0

短使用Apache處理程序觸摸內部認證*數據結構,最好的辦法就是使用環境變量。你會在你的PHP代碼

apache_setenv('USERID','jrodriguez',true); 

使用apache_setenv設置一個最高級別的環境變量,然後使用「%{USERID} E」,而不是「在你的Apache配置一個LogFormat的條目將值寫入日誌文件%U」

LogFormat "%v:%p %h %l %{USERID}e %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" envuid_combined 
CustomLog /path/to/access.log envuid_combined 

當然,執行實際 HTTP認證時,真正的證書將被永遠失去了,所以考慮節省%U別的地方 - 無論是在一個新的領域或並行的日誌文件。

+0

環境變量不是全局的,因此不可靠 – 2010-08-02 17:07:55

+0

@Esben不確定你的意思,但總的來說,沒有 - 一個環境變量不是全局的。上述解決方案對我來說非常合適。 – rjmunro 2011-01-18 12:51:38

7

因爲Apache 2.4.7阿帕奇可以讓你的響應頭複製到一張紙條。因此,如果您不將PHP作爲Apache模塊運行(但例如使用PHP-FPM),並且您也不希望將日誌值發送給客戶端(如果將它設置爲響應頭),這裏有一個辦法做到這一點:

PHP:

header('X-Username: '.$username); 

的httpd.conf:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{username}n\"" logfmtname 

vhost.conf:

CustomLog logs/vhost-access_log logfmtname 

# copy response-header value to note 
Header note X-Username username 
# unset response-header so client won't get it 
Header unset X-Username 
相關問題