这篇文章上次修改于 2347 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

程序在进过nginx<nginx<apache这样的调度器后,无法获取客户端真实ip。

大家在开发过程中,如果需要获取用户的真实IP,需先判断X-FORWARDED-FOR是否存在,如果存在此header,则优先取这个值.获取逻辑大致如下:

(注意,经过多层代理后,X-Forwarded-For 字段可能包含多个IP,格式如下: X-Forwarded-For: clientIp, proxy1, proxy2 )

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))  {

              $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];

       } else {

              $ip=$_SERVER['REMOTE_ADDR'];

        }

解决办法:
在最靠近用户层的nginx上,设置一下header

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header  X-Forwarded-Host $host;

解决办法:在最靠近应用程序后端的nginx上,通过以下header信息

proxy_pass_header X-Real-IP;
proxy_pass_header X-Forwarded-For;
real_ip_header X-Forwarded-For;