我正在开发一个应用程序,该应用程序从request检测用户的IP地址,并限制他们根据所在国家/地区对某个页面执行某些操作。
当用户通过某个Web代理向我们的应用程序发出请求时,我们无法获取用户设备的原始IP地址,因此无法获取该国家/地区的原始IP地址。网络代理的示例可以是hide.me等网站,也可以是GeoProxy等浏览器扩展程序。
我尝试扫描Rails控制器中的整个request
对象,看看是否有关于用户真实IP地址的信息,但我的每一次尝试似乎都返回了Web代理的IP地址。请参阅下面的一些结果(开发模式+ ngrok):
> request.ip
=> "154.48.196.3" # This is IP address of web proxy i used, while my actual IP address is "119.82.x.x"
> request.remote_ip
=> "154.48.196.3"
> request.remote_addr
=> "127.0.0.1"
> request.env
=> {"GATEWAY_INTERFACE"=>"CGI/1.1",
"PATH_INFO"=>"/shops/alinea",
"QUERY_STRING"=>"",
"REMOTE_ADDR"=>"127.0.0.1",
"REMOTE_HOST"=>"localhost",
"REQUEST_METHOD"=>"GET",
"REQUEST_URI"=>"https://86d3f832.ngrok.io/shops/alinea",
"SERVER_NAME"=>"86d3f832.ngrok.io",
"SERVER_PORT"=>"443",
"SERVER_PROTOCOL"=>"HTTP/1.1",
"SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/2.1.10/2016-04-01)",
"HTTP_HOST"=>"86d3f832.ngrok.io",
"HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36",
"HTTP_ACCEPT"=>"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"HTTP_X_FORWARDED_PROTO"=>"https",
"HTTP_X_FORWARDED_FOR"=>"154.48.196.3",
...}
> request.env['HTTP_X_FORWARDED_FOR']
=> "154.48.196.3"
有人可以指导我如何生成一个万无一失的解决方案,无论他们如何尝试访问我们的应用程序,每次都会返回用户的原始IP地址吗?
最佳解决方案应涵盖this doc尽可能多的积分。