在大部分实际业务场景中,网站访问请求并不是简单地从用户(访问者)的浏览器直达网站的源站服务器,中间可能经过所部署的CDN、高防IP、WAF等代理服务器。 # 例如,网站可能采用这样的部署架构:用户 > CDN/高防IP/WAF/游戏盾 > 源站服务器。这种情况下,访问请求在经过多层加速或代理转发后,源站服务器该如何获取发起请求的真实客户端IP? # 问:如何获取访问用户的真实IP呢? # 答:为解决这个问题,可以通过在舍末盾转发的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") 已经接入舍末盾的用户,可以修改配置的方式,从日志中获取用户的真实IP,以便了解用户的访问情况。 # # ## [源站获取客户端真实IP]() 舍末盾会在回源请求头中添加 X-Real-IP 和 X-Forwarded-For 两个字段来传递来访用户的真实IP,在源站服务器中可进行相应的[配置]()以便获取这两个字段的值。 #### [X-Real-IP 与 X-Forwarded-For 的区别]() 代理服务器(比如舍末盾)会把请求的来源IP写入 X-Real-IP 字段,然后发送给源站,这个字段只会有一个IP地址;而每经过一级代理,代理服务器会把来源追加到 X-Forwarded-For 中,在多次代理的情况下,则该字段会有多个IP地址(真实IP, 代理服务器1, 代理服务器2, ...)。 ## [源站获取客户端真实端口]() 舍末盾会在回源请求头中添加 X-Real-Port 字段来传递来访用户的真实端口,源站可通过这个头部字段获取用户客户端真实的端口。