2013-10-11 16 views
9

muszę przechowywać adres IP gości do naszej bazy danych i oto sposób staram się zrobić:Szyny - jak uzyskać adres IP odwiedzającego?

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

Ale w obu przypadkach zmienna @ip przechowywana wartość 127.0.0.1, nawet gdy Wdrażam aplikację do instancji Amazon EC2.

Po sprawdzeniu http://www.whatismyip.com/ pokazuje ono moje IP jako 109.175.XXX.X.

W związku z tym dlaczego zmienna ruby ​​zawsze wyświetla adres 127.0.0.1? Jak uzyskać prawdziwy adres IP?


EDIT: Oto wyjście następuje:

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 

Myślałem, że problem jest tylko z mojej strony, ale wysłałem linki do 3 z moich znajomych i wszyscy z nich zobaczyć ten sam adres IP, tylko 127.0.0.1.

Rozwiązuję ten problem przez cały dzień i wciąż nie osiągam sukcesu.

Dziękuję

+0

może twoja aplikacja znajduje się za [odwrotnym proxy] (http://en.wikipedia.org/wiki/Reverse_proxy)? –

+0

Jak "odwiedzający" odwiedza twój serwer? Kiedy używasz instancji EC2, w jaki sposób wysyłasz żądanie do serwera? –

+0

Po prostu otworzyłem moją stronę w przeglądarce i ponownie załadowałem stronę, ponieważ chciałem zobaczyć zmieniony adres IP - ale nadal jest taki sam jak na localhost - 127.0.0.1 – user984621

Odpowiedz

12

Gdy użytkownik odwiedza witrynę lokalnie idziesz z lokalnym adresem IP, czyli 127.0.0.1.

To, co robisz, jest poprawną drogą do adresu IP odwiedzającego, a wynik, który widzisz, jest zgodny z oczekiwaniami.

Chcesz użyć

@ip = request.remote_ip 

ponieważ uwzględnia większość przypadków reverse proxy i innych sytuacjach, które można napotkać gdzie request.env['REMOTE_ADDR'] może być zerowa lub adres lokalnego pełnomocnika.

Jeśli rzeczywiście masz odwrotne proxy przed serwerem aplikacji (i prawdopodobnie to robisz), musisz upewnić się, że ustawia odpowiednie nagłówki podczas przesyłania żądań. Jako minimum należy ustawić wartość X-Forwarded-For header.

+0

dziękuję za odpowiedź. Ale prawdę mówiąc, wciąż nie rozumiem, dlaczego otrzymuję ** 127.0.0.1 ** na Amazon EC2. Przetestowałem to również za pomocą polecenia 'request.remote_ip'. Dlaczego w trybie produkcyjnym na EC2 wyświetlany jest tekst ** 127.0.0.1 ** zamiast ** 109.175.XXX.X **? – user984621

+0

Bez znajomości konfiguracji trudno powiedzieć. Najprawdopodobniej trafiasz na serwer proxy służący do pośredniczenia, który przekazuje żądania do tego, co obsługujesz Railsy (Unicorn, Thin, Webrick). Ten serwer proxy jest lokalny dla Twojej aplikacji, a jeśli nie ustawi oczekiwanych nagłówków, request.remote_ip nie odbierze oryginalnego adresu IP. –

+0

To pomaga, używam Unicorn. (Nie wiem o proxy) – user984621

Powiązane problemy