当前位置: 首页 > 后端技术 > PHP

Nginx前端设置反向代理,后端Apache如何获取访问者真实IP,结合PHP

时间:2023-03-29 22:12:00 PHP

nginx反向代理后,应用中获取的ip就是反向代理服务器的ip,获取的域名也是反向代理配置的url的域名。要解决这个问题,需要在nginx反向代理配置中加入。一些配置信息,目的是将客户端的真实ip和域名传递给应用程序。①:这是php获取REMOTE_ADDR(内网地址)时的情况。②:得到的是攻击者伪造的ip地址。攻击者可以随意伪造一个header信息,在header中填入一个ip发送。php获取HTTP_CLIENT_IP时就是这种情况。伪造的ip导致我们的数据库存储了一个虚假的ip,无法真正判断攻击者的来源。比如批量注册账号的注册ip,登录ip等。配置如下:location~*\.(jpg|png|gif)${proxy_set_headerX-Forwarded-For$remote_addr;#proxy_passhttp://....}location~\.php${proxy_set_headerX-Forwarded-For$remote_addr;#proxy_passhttp://....}PHP代码:functiongetIP(){$ip="unknown";if(getenv("HTTP_X_FORWARDED_FOR")){//这个在最上面有提到,作为优先级,nginxagent会获取用户的真实ip并post到这个环境变量上,这个环境变量必须由nginx配置HTTP_X_FORWARDED_FOR$ip=getenv("HTTP_X_FORWARDED_FOR");}elseif(getenv("REMOTE_ADDR")){//在nginx作为反向代理的架构中,使用REMOTE_ADDR得到的ip将是反向代理的ip,即nginx服务器的ip地址.经常以内网ip的形式出现。$ip=getenv("REMOTE_ADDR");}elseif($_SERVER['REMOTE_ADDR']){$ip=$_SERVER['REMOTE_ADDR'];}elseif(getenv("HTTP_CLIENT_IP")){//HTTP_CLIENT_IP攻击攻击者可以伪造这样的头信息,从而得到攻击者随意设置的ip地址。$ip=getenv("HTTP_CLIENT_IP");}返回$ip;}综上所述,在nginx作为反向代理的架构中,php的REMOTE_ADDR(其他语言类似的名字)会获取到nginx代理的ip地址。如果获取不到用户的真实ip,可以获取nginx反向代理服务器的地址。REMOTE_ADDR旨在成为远程地址。Nginx是将请求转发给php的代理层。php获取到的远程地址其实就是nginx反向代理服务器的ip,符合协议规则。不过nginx可以帮我们获取到用户的真实ip,写入一个环境变量,然后转发给我们,只要遵循一定的约定名称即可,比如约定名称为HTTP_X_FORWARD_FOR(其他名称也可以)同意,关键看nginx里的配置才算全公司统一)。nginx配置类似这样:fastcgi_paramHTTP_X_FORWARD_FOR$remote_addr;上一句的目的是将HTTP_X_FORWARD_FOR的值设置为$remote_addr的值。即把用户的真实ip(或者用户的代理ip)放入HTTP_X_FORWARD_FOR。$remote_addr是nginx的内置变量。该变量获取用户的真实ip地址(如果用户使用代理,则为代理的ip地址)。所以在php端可以通过getenv("HTTP_X_FORWARDED_FOR")获取到nginx传过来的值,也就是用户的真实ip地址。