0x01 前言

我的Wordpress是经过多重代理才到达后端的PHP,在网站刚上线的时候,在网站后台或日志中看到的所有来源日志都是源自IP:127.0.0.1,这肯定是不正确的,也不利于统计分析。

0x02 解决

我的前端使用nginx,nignx后面跟着apache,最后才是PHP。为了便捷性,我使用以下header进行真实用户IP的传递:

X-Forwarded-For

首先设置nginx,在server段中添加以下内容并重新加载nginx:

#添加以下内容
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#重新加载nginx
nginx -s reload

$proxy_add_x_forwarded_for 这个变量会将所有代理的IP都包含其中,而第一个IP就是用户的真实IP,值的格式如下:

HTTP_X_FORWARDED_FOR => remote_ip,proxy1_ip, proxy2_ip,... ...

然后配置apache,如果你没有使用apache,可以跳过这一步。首先需要确认你加载了相应的模块:

LoadModule remoteip_module modules/mod_remoteip.so

然后在httpd.conf中添加以下内容并重新启动apache:

#添加以下内容
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1

#从新启动apache
[root@test ~]# systemctl restart httpd.service

完成后还需要将以下内容添加至wp-config.php或主题文件中的functions.php文件中,两者取一即可:

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  $_SERVER['REMOTE_ADDR'] = $ips[0];
}

0x03 结语

完成后,一切顺利的话,访客的真实IP就可以完美地传递到后端了。