2013-10-11 3 views
9

Ich brauche unsere Datenbank zu speichern Besucher IP-Adresse und hier ist die Art, wie ich das zu tun versuche:Schienen - Wie bekomme ich die IP-Adresse meiner Besucher?

@ip = request.remote_ip 
@ip = request.env['REMOTE_ADDR'] 

Aber in beiden Fällen die @ip Variable den Wert 127.0.0.1, auch dann gespeichert, wenn Ich stelle die App auf Amazon EC2-Instanz bereit. Wenn ich http://www.whatismyip.com/ überprüfe, zeigt es meine IP als 109.175.XXX.X an.

Warum zeigt also die Ruby-Variable immer die 127.0.0.1 Adresse an? Wie bekomme ich die echte IP?


EDIT: Hier ist die Ausgabe von folgenden:

request.env['HTTP_X_FORWARDED_FOR'] => 
request.remote_ip => 127.0.0.1 
request.env['REMOTE_ADDR'] => 127.0.0.1 
request.ip => 127.0.0.1 

Ich dachte, dass das Problem nur auf meiner Seite, aber ich schickte Links zu 3 Freunden und alle von ihnen sehen die gleiche IP, nur 127.0.0.1.

Ich löse dieses Problem den ganzen Tag und immer noch keinen Erfolg.

Danke

+0

vielleicht ist Ihre App hinter einem [Reverse Proxy] (http://en.wikipedia.org/wiki/Reverse_proxy)? –

+0

Wie besucht der "Besucher" Ihren Server? Wenn Sie die EC2-Instanz verwenden, wie senden Sie die Anfrage an den Server? –

+0

Einfach habe ich meine Website im Browser geöffnet und die Seite neu geladen, weil ich dort die geänderte IP sehen wollte - aber da ist immer noch das selbe wie auf localhost - 127.0.0.1 – user984621

Antwort

12

Wenn Sie eine Website besuchen lokal Sie von der lokalen IP-Adresse kommen, dh 127.0.0.1.

Was Sie tun, ist der korrekte Weg zur Besucher-IP-Adresse, und das Ergebnis, das Sie sehen, ist wie erwartet.

Sie wollen

@ip = request.remote_ip 

verwenden, da die Rechnung die meisten Fälle von Reverse-Proxys und andere Situationen nimmt auftreten können, wo request.env['REMOTE_ADDR'] nil oder die Adresse des lokalen Proxy sein könnte.

Wenn Sie tatsächlich einen Reverse Proxy vor Ihrem Anwendungsserver haben (und Sie wahrscheinlich tun), müssen Sie sicherstellen, dass er die richtigen Header beim Weiterleiten der Anfragen setzt. Als Minimum sollte X-Forwarded-For header eingestellt werden.

+0

danke für deine Antwort. Aber ehrlich gesagt verstehe ich immer noch nicht, warum ich auf Amazon EC2 ** 127.0.0.1 ** empfange. Ich habe es auch mit dem Befehl 'request.remote_ip' getestet. Warum wird im Produktionsmodus auf EC2 ** 127.0.0.1 ** statt ** 109.175.XXX.X ** angezeigt? – user984621

+0

Ohne Ihr Setup zu kennen, ist es schwer zu sagen. Wahrscheinlich triffst du einen Proxy-Webserver, der die Anfragen über (Unicorn, Thin, Webrick) an all das weiterleitet, wofür du Rails bereitstellst. Dieser Proxy ist lokal für Ihre App und wenn er nicht die erwarteten Header setzt, wird request.remote_ip die ursprüngliche IP nicht abholen. –

+0

Es hilft, ich laufe auf Unicorn. (Ich weiß nicht über den Proxy) – user984621