Как получить реальный IP-адрес от пользовательского клиента при посещении моего сайта с использованием рельсов в режиме разработки

Я хочу получить реальный IP-адрес от пользовательского клиента при посещении моего сайта с использованием рельсов в режиме разработки?

но когда я печатаю request.remote_ip, я получаю IP-адрес 127.0.0.1??

как получить реальный IP-адрес???

и когда я пытаюсь curl -H"X-Forwarded-For: 8.8.8.8" http://httpbin.org/ip, я получаю свой реальный IP-адрес, но когда я пытаюсь внедрить gem https://github.com/geokit/geokit-rails чтобы получить IP-адрес, основанный на стране... мой IP-адрес не действителен?

я пытаюсь это:

IpGeocoder.geocode('my.real.ip.address')

и получить ошибку, как это:

Geokit::Geocoders::GeocodeError: Geokit::Geocoders::GeocodeError

но если я попробую IP-адрес из примера:

IpGeocoder.geocode('12.215.42.19')

это работает

=> Provider: hostip
Street: 
City: Aurora
State: TX
Zip: 
Latitude: 33.0582
Longitude: -97.5159
Country: US
Success: true 

что не так в моем IP-адресе? я получаю свой настоящий IP-адрес от "curl -H" X-Forwarded-For: 8.8.8.8 " http://httpbin.org/ip"

если я ошибаюсь, скажи мне спасибо

2 ответа

Вот идея, которая может помочь:


Localhost

Когда вы загружаете сервер Rails в процессе разработки, вы получаете доступ к своему локальному хосту. Это означает, что любые запросы к этому серверу будут обрабатываться как локальные соединения (127.0.0.1)

Вы должны помнить, что Rails - это серверная технология, которая означает, что она может обрабатывать только запросы как полученные (она не имеет отношения к тому, откуда поступают эти запросы). Вы можете увидеть это с помощью промежуточного программного обеспечения ActiveDispatch::Request:

local?() Истинно, если запрос пришел от localhost, 127.0.0.1.

Это означает, что если вы отправите запрос на ваш локальный сервер Rails, он будет обрабатывать его как локальный запрос (127.0.0.1)


GeoLocation IP

Ваш Geolocation работал для вашего WAN IP (ваш удаленный IP) вручную

Причина в том, что API / служба GeoLocation, которую использует гем, будет проверять связь со сторонним сервером, который будет искать DNS или другие географические местоположения для этого IP:

Из GeoKit GitHub:

Поиск местоположения на основе IP с использованием hostip.info. Укажите IP-адрес и получите взамен название города и широту / долготу.

Как и любой API, ответ будет зависеть от ввода. Проблема в том, что Rails обрабатывает ваши запросы как локальные (от 12.7.0.0.1), он будет отправлять только тот IP, который не имеет отношения к GeoLocation (он локальный для вашей системы, а не для всего мира)


JS

Чтобы обойти это, вам нужно найти способ найти WAN IP вашей системы в процессе разработки, что вы можете сделать с помощью JS:

Как получить IP-адрес клиента, используя только javascript? (см. ответ Чеда Гранта):

<script type="application/javascript">
    function getip(json){
      alert(json.ip); // alerts the ip address
    }
</script>

<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>

Я не проверял это, но, надеюсь, это даст вам представление о том, что может пойти не так

Попробуйте использовать ngrok для создания туннеля к вашему локальному серверу.

Другие вопросы по тегам