在本地Rails开发环境中获取真实的IP地址

gko*_*lan 41 geocoding ruby-on-rails ip-address

我有Rails 2.3.8,Ruby 1.8.7,Mongrel Web Server和MySQL数据库.

我处于开发模式,我需要找到真正的IP地址

当我使用时,request.remote_ip我正在获取IP127.0.0.1

我知道我得到了127.0.0.1因为我在本地机器上开发..但即使我在本地机器上,有没有办法获得真正的IP地址?

我在我的控制器中使用下面提到的这些,我得到的就是127.0.0.1视图中的所有这些.

request.remote_ip
request.env["HTTP_X_FORWARDED_FOR"]
request.remote_addr
request.env['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)

Mis*_*cha 32

据我所知,没有标准的方法来获取本地计算机的远程地址.如果您需要远程地址来(测试)地理编码,我建议将127.0.0.1添加到数据库表中,该表与匹配IP地址的地址相匹配.

作为最后的手段,您也可以硬编码您的远程地址.像这样:

class ApplicationController < ActionController::Base
  def remote_ip
    if request.remote_ip == '127.0.0.1'
      # Hard coded remote address
      '123.45.67.89'
    else
      request.remote_ip
    end
  end
end

class MyController < ApplicationController
  def index
    @client_ip = remote_ip()
  end
end
Run Code Online (Sandbox Code Playgroud)


Swa*_*and 16

我不认为你会在localhost上得到你的'real-ip',其原因实际上在于TCP/IP.

远程IP地址取决于发送请求的网络.由于它是TCP/IP的一部分,在通信时发送您的IP地址,因此它总是转换为目标计算机可能理解的相对IP地址.当请求在您的子网内时,它是您的本地IP.当它通过您的服务提供商进入网络时,它会假设一个全局IP,可以追溯到服务提供商(注意:这是有争议的,取决于您的网络设置).

因此,如果您在本地进行测试,那么您将体验到127.0.0.1.如果您通过本地网络发送,它将是您网络中的IP.例如,我办公室网络中的机器IP为192.168.1.7,如果我通过同一网络中的另一台计算机从3000端口访问我的应用程序,比如从192.168.1.13,那么我得到request.remote_ip为192.168.1.13

这意味着,当您使用localhost时,127.0.0.1 您真正的IP.同样在我提到的示例中,192.168.1.13是发送请求的机器的真实IP.


BSB*_*BSB 13

这就是我现在通常做的事情:

if Rails.env.production?
  request.remote_ip
else
  Net::HTTP.get(URI.parse('http://checkip.amazonaws.com/')).squish
end
Run Code Online (Sandbox Code Playgroud)


let*_*nje 5

取决于您如何访问网址.

如果您使用http://127.0.0.1/....或访问网址http://localhost/....,您将获得127.0.0.1远程IP.如果您在局域网上,请使用http:// {lan-ip}/....

例如 http://172.20.25.210/.......


Mit*_*uyn 5

我必须这样做:

require 'socket'
Socket.ip_address_list.detect(&:ipv4_private?)&.ip_address
Run Code Online (Sandbox Code Playgroud)