【问题标题】:Ruby geocoder on Heroku yields private IP addressHeroku 上的 Ruby 地理编码器产生私有 IP 地址
【发布时间】:2015-02-28 16:35:48
【问题描述】:

Ruby Geocoder (http://rubygeocoder.com/) 可以很好地获取已知地址的纬度和经度。现在我正在尝试使用它通过 IP 地址查找国家代码,这样新用户就不必选择他们的国家。

if @person.country.blank?
    ip_loc = Geocoder.search(my_ip_address)
    if ip_loc.present?
       @person.country = ip_loc[0].data['country_code']
    end
end

为了让他们的 IP 地址为 Geocoder 提供数据,我使用的是套接字:

 def my_ip_address
    require 'socket'
    list=Socket.ip_address_list
    ip = list.detect{|intf| intf.ipv4_private?}
    ip.ip_address if ip
 end

由于 IP 查找不适用于开发机器(IP 地址始终是私有的内部编号),我正在尝试在 Heroku 上进行测试。

但是,当它在 Heroku 上运行时,我仍然得到一个无法使用 Geocoder 查找的私有 IP 地址 172.19.75.142。

有人可以引导我朝着有效的方向发展,从 IP 中获取 Country 并在 Heroku 上运行吗?

【问题讨论】:

  • 明确一点...您想要运行应用程序的服务器的 IP 地址(以及国家/地区)吗?不是访问该网站的用户?
  • 我想要访问服务器的用户的IP地址。我要确定的是他们的国家/地区。
  • 然后就像 Joel Brewer 下面提到的那样,您需要 request.remote_ip。请注意,如果您在本地开发,这仍然是一个内部 IP,所以您应该有一个后备。

标签: ruby-on-rails heroku ip rails-geocoder


【解决方案1】:

您可以使用request.remote_ip 获取用户/客户端的IP 地址。然后,您应该能够将此值输入地理编码器。

请注意,request 仅在您的控制器中可用。

【讨论】:

  • 对于本地开发,您可以添加此条件检查以跳过查找。如果这是真的,请不要打扰,因为它是私有 IP。 ['127.0.0.0/8', '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', '192.168.10.0/8'].none?{|block| IPAddr.new(block) === request.remote_ip}
  • 感谢两位提供的有用信息!
  • @PhilipHallstrom 我花了一点时间才意识到您提供的内容是用于 if 语句。在 else 块中,我们应该使用 request.remote_ip
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2011-02-15
  • 2015-10-26
  • 1970-01-01
  • 2010-09-10
  • 2011-03-15
相关资源
最近更新 更多