0

在开发模式下使用 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 地址:

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”X-Forwarded-For: 8.8.8.8“ http://httpbin.org/ip ”获取我的真实 IP 地址

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

4

2 回答 2

2

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


本地主机

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

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

local?() 如果请求来自本地主机 127.0.0.1,则为真。

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


地理位置 IP

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

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

来自GeoKit GitHub

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

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


JS

为了解决这个问题,您必须找到一种方法来找到正在开发的系统的 WAN IP,您可以使用 JS 来完成:

如何仅使用 javascript 获取客户端的 IP 地址?(见乍得格兰特的回答):

<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>

我没有对此进行测试,但希望它能让您了解可能出现的问题

于 2014-01-06T09:28:29.743 回答
0

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

于 2014-01-18T00:19:42.500 回答