如何获取访客真实IP?
在大部分实际业务场景中,网站访问请求并不是简单地从用户(访问者)的浏览器直达网站的源站服务器,中间可能经过所部署的CDN、高防IP、WAF等代理服务器。
例如,网站可能采用这样的部署架构:用户 > CDN/高防IP/WAF/游戏盾 > 源站服务器。这种情况下,访问请求在经过多层加速或代理转发后,源站服务器该如何获取发起请求的真实客户端IP?
问:如何获取访问用户的真实IP呢?
答:为解决这个问题,可以通过在CDN转发的HTTP头信息中增加 X-Forwarded-For 信息,用于记录客户端的真实IP,这时web服务器的日志就可以使用 $http_x_forwarded_for变量记录远程客户端的真实IP。格式如下:
Nginx
'$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" ';
Apache
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
ASP
Request.ServerVariables("HTTP_X_FORWARDED_FOR")
PHP
$_SERVER["HTTP_X_FORWARDED_FOR"]
JSP
request.getHeader("HTTP_X_FORWARDED_FOR")
已经接入CDN的用户,可以修改配置的方式,从日志中获取用户的真实IP,以便了解用户的访问情况。
源站获取客户端真实IP
CDN会在回源请求头中添加 X-Real-IP 和 X-Forwarded-For 两个字段来传递来访用户的真实IP,在源站服务器中可进行相应的配置以便获取这两个字段的值。
X-Real-IP 与 X-Forwarded-For 的区别
代理服务器(比如CDN)会把请求的来源IP写入 X-Real-IP 字段,然后发送给源站,这个字段只会有一个IP地址;而每经过一级代理,代理服务器会把来源追加到 X-Forwarded-For 中,在多次代理的情况下,则该字段会有多个IP地址(真实IP, 代理服务器1, 代理服务器2, ...)。
源站获取客户端真实端口
CDN会在回源请求头中添加 X-Real-Port 字段来传递来访用户的真实端口,源站可通过这个头部字段获取用户客户端真实的端口。