2010-08-02 2 views
9

Apache 로그 설정에서 HTTP 인증 사용자 이름을 기록하도록 지정할 수 있습니다. 대부분의 PHP 스크립트에는 자체 쿠키 기반 인증이 있습니다. 인증이 쿠키를 기반으로하더라도 PHP가 로깅 용 HTTP 인증 사용자 이름을 Apache에 제공 할 수 있습니까? 그렇다면 코드는 어떻게 생겼을까요? 그렇지 않다면 대안은 무엇입니까?PHP를 사용하고 HTTP 인증을 사용하지 않고 아파치 access_log에 사용자 이름 입력

+0

I 응답 헤더), 여기에 그것을 할 수있는 방법이있다 좋은 생각이라고 생각하지 마십시오. 별도의 로그 파일을 사용하지 않는 이유는 무엇입니까? –

+1

AWStats와 같은 도구를 사용하여 간단한 통계를 작성하고 싶습니다. – chiborg

답변

11

아파치는 모듈간에 데이터를 전달합니다. 노트. PHP를 Apache 모듈로 실행하는 경우 apache_note()을 사용하여 메모를 가져오고 설정할 수 있습니다. 이 파일을 액세스 로그에 기록하려면 the %{note_name}n log format string을 포함 할 수 있습니다. 이렇게해도 데이터가 다시 클라이언트로 누출되지는 않습니다. PHP에서

:

apache_note('username', $username); 

서버 구성에서 :

아파치 당신이 메모에 응답 헤더를 복사 할 수 있습니다 아파치 2.4.7 이후
LogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username 
CustomLog logs/access_log common_with_php_username 
2

어딘가에 다른 사용자 이름 &을 저장하고 로그에 쿠키 값 (보통 %{PHPSESSID}C)을 기록하도록 허용 한 다음 추적 할 수 있습니다.

또 다른 옵션은 바람직 바로 session_start 후 클라이언트로 사용자 이름과 헤더를 전송하는 것입니다 :

PHP :

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

때 CustomLog :의

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

짧은 아파치 핸들러를 사용하여 내부 auth * 데이터 구조를 만 드는 것이 가장 좋은 방법은 환경 변수에 의존하는 것입니다. 당신은 당신의 PHP 코드

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

을에 apache_setenv 사용하여 최고 수준의 환경 변수를 설정 한 후 ""% {USERID} 전자 "를 사용하는 대신 아파치 설정에서 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의 인증을 수행하는 실제 자격 증명을 영원히 손실 될 수 있으므로 유 다른 곳 %를 절약 고려 - 새 필드 또는 병렬 로그 파일 중 하나.

+0

은 환경 변수가 전역 변수가 아니기 때문에 신뢰할 수 없습니다. –

+0

@Esben 정확히 무엇을 의미하는지는 모르지만 일반적으로 환경 변수는 글로벌 변수가 아닙니다. 위의 솔루션은 나를 위해 완벽하게 작동합니다. – rjmunro

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 
관련 문제