Как получить реальный 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 для создания туннеля к вашему локальному серверу.