如何在开发模式下使用rails访问我的网站时从用户客户端获取真实的IP地址

时间:2014-01-06 06:51:44

标签: ruby-on-rails geokit

我想在开发模式下使用rails访问我的网站时从用户客户端获取真实的IP地址?

但是当我输入request.remote_ip时,我得到ip地址127.0.0.1 ??

如何获得真正的IP地址???

当我尝试curl -H"X-Forwarded-For: 8.8.8.8" http://httpbin.org/ip时,我得到了我的真实IP地址,但是当我尝试实现gem https://github.com/geokit/geokit-rails来获取基于国家的IP地址时......我的ip无效?

我试试这个:

IpGeocoder.geocode('my.real.ip.address')

并得到如下错误:

Geokit::Geocoders::GeocodeError: Geokit::Geocoders::GeocodeError

但是如果我从示例中尝试ip adrress:

IpGeocoder.geocode('12.215.42.19')

它的作品

=> Provider: hostip
Street: 
City: Aurora
State: TX
Zip: 
Latitude: 33.0582
Longitude: -97.5159
Country: US
Success: true 

我的IP地址有什么问题?我从“curl -H”获得我的真实IP地址X-Forwarded-For:8.8.8.8“http://httpbin.org/ip

如果我错了,请告诉我,谢谢

2 个答案:

答案 0 :(得分:2)

这是一个可能有所帮助的想法:


<强>本地主机

在开发中加载Rails服务器时,您正在访问您的 localhost。这意味着对此服务器发出的任何请求都将被视为本地连接(127.0.0.1

您必须记住Rails是服务器端技术,这意味着它只能处理收到的请求(它与这些请求的来源无关)。您可以通过ActiveDispatch::Request中间件看到这一点:

  

本地?()   如果请求来自localhost,127.0.0.1。

,则为True

这意味着如果您向本地Rails服务器发送请求,它只会将其视为本地请求(127.0.0.1


GeoLocation IP

您的地理位置适用于您的WAN IP(您的远程IP)

原因是gem使用的GeoLocation API /服务将ping第三方服务器,该服务器将查找该IP的DNS或其他地理位置:

来自GeoKit GitHub

  

利用hostip.info进行基于IP的位置查找。提供IP地址,   并获得城市名称和纬度/经度作为回报

与任何API一样,响应将取决于输入。问题是因为Rails将您的请求视为 local (来自12.7.0.0.1),它只会发送与GeoLocation无关的IP(它对您的系统来说是本地的,而不是世界)


<强> JS

要解决这个问题,你必须找到一种方法来开发你的系统的WAN IP,你可以用JS来做:

How to get client's IP address using javascript only?(见Chad Grant的回答):

<script type="application/javascript">
    function getip(json){
      alert(json.ip); // alerts the ip address
    }
</script>

<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>

我没有对此进行测试,但希望它可以为您提供可能出现问题的建议

答案 1 :(得分:0)

尝试使用ngrok创建到本地服务器的隧道。