2010-10-08 10 views
36

Tengo Rails 2.3.8, Ruby 1.8.7, servidor web Mongrel y base de datos MySQL.Obtenga una dirección IP real en el entorno de desarrollo de Rails local

estoy en el modo de desarrollo y necesito encontrar la dirección IP real de

Cuando uso request.remote_ip estoy consiguiendo el IP como 127.0.0.1

sé que estoy recibiendo 127.0.0.1 porque Estoy desarrollando en la máquina local ... pero ¿hay alguna manera de obtener la dirección IP real, incluso si estoy en la máquina local?

Estoy usando estos mencionados a continuación en mi controlador y todo lo que obtengo es 127.0.0.1 con todos ellos en la vista.

request.remote_ip 
request.env["HTTP_X_FORWARDED_FOR"] 
request.remote_addr 
request.env['REMOTE_ADDR'] 
+0

Esto se debe a que está desarrollando en su máquina local. Si este código está en un servidor y accede a la página desde un cliente, obtendría la dirección IP * real *. – Mischa

+0

intente ir al servidor en su dirección "real". Así que no vayas a 127.0.0.1, sino a tu 'IP externa'. ¡No olvide ejecutar el servidor para escuchar también esa dirección! – gavit

Respuesta

30

Por lo que puedo ver, no hay un método estándar para obtener la dirección remota de su máquina local. Si necesita la dirección remota para (probar) su geocodificación, le sugiero agregar 127.0.0.1 a su tabla de base de datos que coincida con las direcciones IP con las ubicaciones.

Como último recurso, también podría codificar su dirección remota. P.ej. como este:

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 
15

No creo que obtendrá su 'real-ip' en localhost y la razón de esto en realidad se encuentra en TCP/IP.

La dirección IP remota depende de la red a la que se envía la solicitud. Como es parte de TCP/IP enviar su dirección IP cuando se comunica, siempre se traduce a la dirección IP relativa que la computadora de destino puede comprender. Cuando la solicitud está dentro de su subred, es su IP local. En el momento en que sale a la red a través de su proveedor de servicios, asume una IP global, que puede rastrearse hasta el proveedor del servicio (Nota: esto es discutible y depende de la configuración de su red).

Así que si está probando localmente entonces sería 127.0.0.1 como lo ha experimentado. Si lo está enviando a través de su red local, será su IP dentro de esa red. Por ejemplo, la IP de mi máquina en la red de mi oficina es 192.168.1.7, y si acceso a mi aplicación en el puerto 3000 a través de otra computadora en la misma red, digamos desde 192.168.1.13, entonces obtengo request.remote_ip como 192.168.1.13

Lo que esto significa es que, mientras se encuentra en el host local, 127.0.0.1 es su IP real. Asimismo, en el ejemplo que mencioné, 192.168.1.13 es la IP real de la máquina que envió la solicitud.

+0

entonces, ¿hay alguna forma de obtener la dirección IP de la máquina que envió la solicitud? en su ejemplo ser: 192.168.1.13 – ben

5

Depende de cómo accede a la url.

Si accede a la url usando http://127.0.0.1/.... o http://localhost/...., obtendrá 127.0.0.1 como la dirección IP remota. Si está en una LAN, use http: // {lan-ip}/....

por ej. http://172.20.25.210/.......

1

Si accede a la máquina de desarrollo con su IP real debería obtener su IP real, por lo tanto, no use localhost, pero use su IP real. No todos los enrutadores permitirán el acceso LAN a una máquina a una dirección IP externa que esté realmente en esa LAN, pero la mayoría lo hará.

+0

En ese caso, debe asegurarse de que el servidor escucha en la interfaz específica. Intenté esto una vez y el servidor estaba escuchando solo en la interfaz loopback (127.0.0.1), por lo que mi aplicación Rails nunca recibió la solicitud. Escuchar en '0.0.0.0' hizo el truco. –

1

estoy probando con Rspec y lo que hice fue:

request.stub(:remote_ip).and_return('198.172.43.34') 
Instance.stub(:find_by_key).and_return(@instance) 
before = @instance.weekly_statistic.times_opened_by['198.172.43.34'] 

get :key, :key=>"314C00" 

@instance.weekly_statistic.times_opened_by['198.172.43.34'].should == before+1 

y funcionó como un encanto! :)

1

Problema:

Estábamos tratando de hacer algo similar para un proyecto recientemente y estaban teniendo problemas para usar request.remote_ip en nuestro código. Sigo volviendo 127.0.0.1 o ::1. Cuando se combina con la gema de Geocoder nos estaba dando una matriz vacía y era básicamente inútil.

Solución:

Hay una muy agradable API en telize.com que devuelve la dirección IP de lo golpea. El código se implementó parecía algo como esto:

No es la forma más carriles-y para hacerlo, pero creo que esto es una buena solución, ya que funcionará a nivel local y en la producción también. El único problema potencial es si alcanzas su límite de API, pero para proyectos pequeños esto no debería ser un problema.

6

Esto es lo que normalmente hago hoy en día:

if Rails.env.production? 
    request.remote_ip 
else 
    Net::HTTP.get(URI.parse('http://checkip.amazonaws.com/')).squish 
end 
+0

Esto devolverá la IP real de su máquina de desarrollo – BSB

+0

¿Sabe usted, tiene un límite diario? – 7urkm3n

Cuestiones relacionadas