2010-08-02 24 views
9

Trong cấu hình nhật ký Apache, có thể chỉ định rằng tên người dùng xác thực HTTP sẽ được ghi nhật ký. Hầu hết các tập lệnh PHP đều có xác thực dựa trên cookie của riêng chúng. Có thể trong PHP để cung cấp cho Apache một tên người dùng xác thực HTTP cho mục đích ghi nhật ký, ngay cả khi xác thực dựa trên cookie? Nếu có, mã sẽ trông như thế nào? Nếu không, lựa chọn thay thế là gì?Đặt tên người dùng trong apache access_log bằng PHP và không có HTTP auth

+0

tôi đừng nghĩ đó là ý hay. Tại sao không sử dụng một logfile riêng biệt? –

+1

Bởi vì tôi muốn thực hiện các thống kê đơn giản với một công cụ như AWStats. – chiborg

Trả lời

11

Apache chuyển dữ liệu giữa các mô-đun trong ghi chú. Nếu bạn chạy PHP làm mô-đun Apache, bạn có thể sử dụng apache_note() để nhận và đặt ghi chú. Sau đó, bạn có thể bao gồm the %{note_name}n log format string để ghi điều này vào nhật ký truy cập. Điều này sẽ không "rò rỉ" bất kỳ dữ liệu nào trở lại máy khách.

Trong PHP:

apache_note('username', $username); 

Trong cấu hình máy chủ của bạn:

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

Một khả năng là lưu trữ tên người dùng & phiên làm việc trước đây ở một nơi khác và để nhật ký ghi giá trị cookie trong đó (thường là %{PHPSESSID}C), sau đó bạn có thể theo dõi lại.

Một lựa chọn khác sẽ được gửi một tiêu đề với tên người dùng lại cho khách hàng, tốt nhất là ngay sau khi bạn session_start:

PHP:

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

CustomLog:

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

ngắn của sử dụng trình xử lý Apache để chạm vào cấu trúc dữ liệu auth * nội bộ, đặt cược tốt nhất của bạn là sử dụng các biến môi trường. Bạn sẽ thiết lập một biến môi trường cấp cao nhất sử dụng apache_setenv trong mã PHP của bạn

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

và sau đó ghi giá trị vào file log với một mục LogFormat trong cấu hình Apache của bạn sử dụng "% {USERID} e" thay vì " % 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 

Tất nhiên, các chứng thực khi thực hiện thực tế auth HTTP sẽ bị mất mãi mãi, vì vậy cân nhắc việc tiết kiệm% u ở một nơi khác - hoặc trong một lĩnh vực mới hoặc trong một tập tin đăng nhập song song.

+0

sẽ không phải là một biến môi trường toàn cầu và như vậy là không đáng tin cậy –

+0

@Esben Không chắc chắn chính xác những gì bạn có ý nghĩa, nhưng nói chung, không - một biến môi trường không phải là toàn cầu. Các giải pháp trên hoạt động hoàn hảo cho tôi. – rjmunro

7

Kể từ Apache 2.4.7 Apache cho phép bạn sao chép một phản ứng-header để một ghi chú. Vì vậy, nếu bạn không chạy PHP như một mô-đun Apache (nhưng ví dụ sử dụng PHP-FPM), và bạn cũng không muốn giá trị log được gửi đến máy khách (thường sẽ xảy ra nếu bạn đặt nó trong một phản ứng-header), đây là một cách để làm điều đó:

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 
Các vấn đề liên quan