接入高防后如何让服务器程序获取用户真实访问IP
很多时候,我们的网站并不是简单的从用户的浏览器直达你的服务器的途径, 考虑到网站的访问速度、安全等属性,我们中间可能会加入高防IP、高防CDN,或者是接入了反向代理模式下的其他的安全产品等。
以网站www.yunzhidian.com接入高防为例,它的流量途径可能是:
普通用户浏览器 —–> 高防(防DDOS、 CC、Web攻击) ——> 源站服务器(PHP 程序部署在这里,iptables, nginx 安全配置)
那么问题来了,经过这么多层加速,服务器如何才能得到发起请求的真实客户端IP呢?
当一个透明代理服务器(如高防)把用户的请求转到后面服务器的时候,如果开启了www.yunzhidian.com的网站防护配置,那么高防会在 Http 的头中加入一个记录
X-Forwarded-For : 用户真实IP, 高防代理IP
如果中间经历了不止一个代理服务器,如经过了CDN等等,那么X-Forwarded-For可能会为以下的形式:
X-Forwarded-For : 用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ….
我们可以看到经过多层代理后, 请求用户的真实IP在第一个位置, 后面会跟一串中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了。那么如何获取X-Forwarded-For的内容?
常用的服务获取X-Forwarded-For字段内容可通过如下方式:
ASP:
Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)
ASP.NET(C#):
Request.ServerVariables[“HTTP_X_FORWARDED_FOR”]
PHP:
$_SERVER[“HTTP_X_FORWARDED_FOR”]
JSP:
request.getHeader(“HTTP_X_FORWARDED_FOR”)
在您获取到X-Forwarded-For的相关内容后,那么以“,”作为区分符截取其中的第一个IP地址即可。