我想在开发模式下使用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”
如果我错了,请告诉我,谢谢
答案 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或其他地理位置:
利用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创建到本地服务器的隧道。