如何在 Rails 中获取客户的 IP 地址?

Posted

技术标签:

【中文标题】如何在 Rails 中获取客户的 IP 地址?【英文标题】:How do I get a client's ip address in Rails? 【发布时间】:2012-11-09 22:58:28 【问题描述】:

我的控制器中有一个函数,它从需要输入 IP 地址的模型中调用另一个函数

  def get_location_users
    if current_user
      return current_user.location_users
    else

      l = Location.find_by_ip(request.remote_ip)

      lu = LocationUser.new(:location_id => l.id, :radius => Setting.get("default_radius").to_i)
      return [lu]
    end
  end

根据我收集的 remote.request_ip 为您提供了 IP 地址,但是当我使用 request.remote_ip 调用该函数时,该对象为零。如果我输入一个静态 IP 地址,尽管它会产生正确的输出。如果 remote.request_ip 不这样做,那么获取 IP 地址的正确方法是什么?

当我尝试在控制台中输入“request.remote_ip”时,它会返回“未定义的局部变量或方法“请求”来自 main”

【问题讨论】:

您是在开发中还是在生产中测试它?此外,它在 Rails 控制台上不起作用是正常的,因为 Rails 控制台不响应 http 调用,因此没有请求对象。 Rails: Get Client IP address的可能重复 【参考方案1】:

您的问题是否有错字,或者您真的在调用 remote.request_ip?

正确的方法是request.remote_ip

【讨论】:

【参考方案2】:

这看起来像是应该在模型中的代码,所以我假设这就是该方法所在的位置。如果是这样,您不能(至少“开箱即用”)从模型访问请求对象,因为它源自 HTTP 请求——这也是您从 main 获得“未定义的局部变量或方法“请求”的原因" 在您的控制台中。

如果这个方法还没有在你的模型中,我会把它放在那里,然后从你的控制器调用它并传入 request.remote_ip 作为参数。

def get_location_users(the_ip)
  if current_user
    return current_user.location_users
  else
    l = Location.find_by_ip(the_ip)
    lu = LocationUser.new(:location_id => l.id, :radius => Setting.get("default_radius").to_i)
    return [lu]
  end
end

然后,在您的控制器中 ::

SomeModel.get_location_users(request.remote_ip)

另外,请注意,如果没有匹配的记录,“Location.find_by_ip”将返回 nil。

而且,您可以在控制台中使用 app.get "some-url" 发出请求,然后您可以从请求对象 app.request.remote_ip 访问 request_ip strong> 并在需要时将其用于测试。

【讨论】:

这是正确的。 request 对象仅在请求的上下文中可用,这意味着:控制器和视图。它在模型(或邮件)中不可用。因此,您必须获取 ip 并将其传递给模型方法,如本例所示。【参考方案3】:

HTTP 请求: request.ip(正如 sebastianh 在他的回答中指出的那样)

也可用作:request.env['action_dispatch.request_id']

HTTPS 请求: request.env['HTTP_X_FORWARDED_FOR'].split(/,/).try(:first)

【讨论】:

以上是关于如何在 Rails 中获取客户的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中获取客户端 IP 地址和 MAC 地址?

如何在 PHP 中获取客户端 IP 地址

如何在 PHP 中获取客户端 IP 地址

如何在 Laravel 5+ 中获取客户端 IP 地址

如何获取web客户端IP地址

如何在 PHP 中获取已连接客户端的 MAC 和 IP 地址?