0

開発モードで Rails を使用して Web サイトにアクセスするときに、ユーザー クライアントから実際の 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アドレスが間違っているのは何ですか? "curl -H"X-Forwarded-For: 8.8.8.8" http://httpbin.org/ip "から実際の IP アドレスを取得します。

間違っていたら教えてください、ありがとう

4

2 に答える 2

2

役立つアイデアを次に示します。


ローカルホスト

開発中に Rails サーバーをロードすると、ローカルホストにアクセスしますこれは、このサーバーに対するすべてのリクエストがローカル接続として扱われることを意味します( 127.0.0.1)

Rails はサーバー側のテクノロジであることを覚えておく必要があります。つまり、Rails は受信したリクエストのみを処理できます (それらのリクエストがどこから来たのかには関係ありません)。ActiveDispatch::Requestミドルウェアでこれを垣間見ることができます。

local?() リクエストが localhost、127.0.0.1 から来た場合は true。

つまり、ローカル Rails サーバーにリクエストを送信すると、ローカル リクエストとして扱われます ( 127.0.0.1) 。


ジオロケーション IP

Geolocation はWAN IP (リモート IP) に対して手動で機能しました

その理由は、gem が使用する GeoLocation API / サービスがサードパーティのサーバーに ping を送信し、DNS またはその IP の他の地理的な場所を検索するためです。

GeoKit GitHubから:

hostip.info を利用した IP ベースのロケーション ルックアップ。IP アドレスを指定すると、都市名と緯度経度が返されます

他の API と同様に、応答は入力によって異なります。問題は、Rails がリクエストをローカル(から12.7.0.0.1) として扱っているため、その IP のみを送信することです。この IP は GeoLocation とは関係ありません (システムに対してローカルであり、世界に対してではありません)。


JS

これを回避するには、開発中のシステムの WAN IP を見つける方法を見つける必要があります。これは、JS で実行できる可能性があります。

javascriptのみを使用してクライアントのIPアドレスを取得するには? (Chad Grantの回答を参照):

<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>

私はこれをテストしていませんが、何がうまくいかないのかについてのアイデアを提供してくれることを願っています

于 2014-01-06T09:28:29.743 に答える
0

ngrokを使用して、ローカル サーバーへのトンネルを作成してみてください。

于 2014-01-18T00:19:42.500 に答える