场景一:无CDN情况
直接通过默认方法获取 HttpContext.Current.Request.UserHostAddress;
场景二:阿里云CDN
当一个七层代理服务器(如高防IP)把用户的访问请求转到后端服务器时,源站默认看到的是这个七层代理服务器(如高防IP)的回源IP。而真实的客户端IP会被七层代理服务器放在HTTP头部的X-Forwareded-For字段,格式如下:X-Forwarded-For: 用户真实IP, 高防代理IP。
如果中间经过不止一个代理服务器(如经过了WAF、CDN等等代理服务器),此时HTTP头部的X-Forwarded-For字段的格式如下:X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, …。
经过多层代理服务器,请求用户的真实IP处于第一个位置,而后面包含所有经过的中间代理服务器的IP。因此,只要获取HTTP头部的X-Forwarded-For字段的内容即可。
具体实现代码截图:
如果通过了CDN
场景三: 阿里云CDN, A站点转发B站点
从head 内容中可以看到多了一个X-ARR-LOG-ID,B站点获取ip的方法和场景二相同。