在Apache2日志中记录真实客户端IP

如果Apache2在Nginx的反向代理后,一般是获取不到客户端的真实IP的,需要另作配置。

首先是在Nginx中添加如下指令:

    location / {  
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }  

其中X-Real-IP记录客户端IP,X-Forwarded-For记录一路经过的代理IP。

同时需要在Apache2修改日志格式,原始格式如下:

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

需要修改的是尾缀为vhost_combined的格式,其中%h代表的是直接访问客户端的访问IP,此处暂不删去,在其后添加%{X-Real-IP}i即可。形如:

LogFormat "%v:%p %h %{X-Real-IP}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined

需要其中经过转发的IP,添加%{X-FORWARDED-FOR}i即可。

注意,能获取到的IP仅仅只是代理或者客户端提供的,如果途径代理未提供则仍不可知,X-FORWARDED-FOR即可由客户端伪造,X-Real-IP更为可靠,但也仅仅只是相对的。

如果请求来自一个正向代理,则仅能获取代理服务器的IP地址。