Vraag Ontvang een echt IP-adres in de plaatselijke ontwikkelingsomgeving van Rails


Ik heb Rails 2.3.8, Ruby 1.8.7, Mongrel Web Server en MySQL-database.

ik ben in de Ontwikkelmodus en ik moet het doen vind het echte IP-adres

Wanneer ik gebruik request.remote_ip Ik krijg het IP-adres als 127.0.0.1 

Ik weet dat ik het krijg 127.0.0.1 omdat ik me op de lokale machine ontwikkel .. maar is er een manier om het echte ip-adres te krijgen, zelfs als ik op de lokale computer ben?

Ik gebruik deze hieronder vermeld in mijn controller en alles wat ik krijg is 127.0.0.1 met allemaal in het zicht.

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

38
2017-10-08 05:31


oorsprong


antwoorden:


Voor zover ik kan zien is er geen standaardmethode voor het ophalen van het externe adres van uw lokale computer. Als u het externe adres nodig hebt voor het testen van uw geocodering, raad ik aan 127.0.0.1 toe te voegen aan uw databasetabel die overeenkomt met IP-adressen met locaties.

Als laatste redmiddel kunt u ook uw externe adres coderen. Bijv. soortgelijk:

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

30
2017-10-08 07:23



Ik denk niet dat je je 'real-ip' op localhost krijgt en de reden hiervoor ligt eigenlijk in TCP / IP.

Het externe IP-adres is afhankelijk van het netwerk waarnaar het verzoek wordt verzonden. Omdat het een onderdeel is van TCP / IP om uw IP-adres te verzenden tijdens het communiceren, vertaalt het zich altijd in een relatief IP-adres dat de bestemmingscomputer mogelijk begrijpt. Wanneer de aanvraag zich binnen uw subnet bevindt, is dit uw lokale IP. Op het moment dat het via uw serviceprovider naar het netwerk gaat, neemt het een wereldwijd IP-adres aan, dat kan worden teruggeleid naar de serviceprovider (Opmerking: dit is betwistbaar en afhankelijk van uw netwerkconfiguratie).

Dus als je lokaal test, dan zou het 127.0.0.1 zijn zoals je hebt ervaren. Als u het via uw lokale netwerk verzendt, is dit uw IP binnen dat netwerk. Het IP-adres van mijn machine in mijn kantoornetwerk is bijvoorbeeld 192.168.1.7, en als ik mijn app op een 3000-poort via een andere computer in hetzelfde netwerk benader, zeg vanaf 192.168.1.13, dan krijg ik de request.remote_ip als 192.168.1.13

Wat dit betekent is, terwijl je op localhost bent, 127.0.0.1 is jouw echte IP. En ook in het voorbeeld dat ik noemde, is 192.168.1.13 het echte IP-adres voor de machine die de aanvraag heeft verzonden.


15
2017-10-08 08:42



Dit is wat ik tegenwoordig meestal doe:

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

7
2018-02-09 17:05



Dit is afhankelijk van hoe u de URL opent.

Als u de URL gebruikt met http://127.0.0.1/.... of http://localhost/.... , je zult het krijgen 127.0.0.1 als de externe ip. Als u een LAN gebruikt, gebruikt u http: // {lan-ip} / ....

voor b.v. http://172.20.25.210/.......


5
2017-10-08 09:03



Als je toegang hebt tot de ontwikkelmachine met je echte IP, zou je je echte IP moeten krijgen, dus gebruik geen localhost, maar je gebruikt je echte IP. Niet alle routers zullen LAN-toegang tot een machine toestaan ​​voor een extern IP-adres dat zich feitelijk op dat LAN bevindt, maar de meeste wel.


1
2018-01-04 16:35



Ik test met Rspec en wat ik deed was:

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

En het werkte als een charme! :)


1
2018-05-05 19:33



Probleem:

We probeerden onlangs iets vergelijkbaars te doen voor een project en hadden problemen met het gebruik ervan request.remote_ip in onze code. Het bleef maar terugkeren 127.0.0.1 of ::1. In combinatie met de Geocoder-edelsteen gaf het ons een lege array en was het in feite nutteloos.

Oplossing:

Er is een hele leuke API bij telize.com waarmee het IP-adres wordt geretourneerd van wat erop valt. De code die we implementeerden zag er ongeveer zo uit:

location = Geocoder.search(HTTParty.get('http://www.telize.com/ip').body)

Het is niet de meest rails-y manier om het te doen, maar ik denk dat dit een redelijk goede oplossing is, omdat het ook lokaal en op productie zal werken. Het enige potentiële probleem is als u hun API-limiet bereikt, maar voor kleine projecten zou dit een non-issue moeten zijn.


1
2018-06-19 14:59