2013-10-09 15 views
24

req.connection.remoteAddress、req.headers ['x-forwarded-for']、req.ip、req.ips、そ​​れはどういう意味ですか?Node.js:クライアントのIPを取得

クライアント/ユーザエージェントのIPアドレスをNode.js/Expressで自分のサイトにリクエストする単純な方法がありますか?私は、すべてのプロキシのことを理解していないか、reqオブジェクトのすべてのプロパティの違いをすべて知っています。また、私はExpressのための '信頼プロキシ'オプションが何であるか理解していません。

誰かが私にこれらのプロパティの違いが何であるかを直接説明し、クライアントのIPをどうやって得ることができるか答えてください。

+0

:いつも私が持っているIPv4アドレスを取得するには

** [ここ](http://stackoverflow.com/a/26310355/458879)**。 – un33k

答えて

46

req.ipは、ExpressでクライアントのIPアドレスを取得する簡単な方法です。使用しているロジックを見ることができます(req.ipsの配列から最初の項目を取得し、その配列はx-forwarded-forヘッダーから構成されます)hereが表示されます。

+0

x-forwarded-forは何ですか? – Sam

+1

サーバーの前にある各プロキシは、x-forwarded-forヘッダーを追加します。もっとたくさんの情報がここにあります:http://en.wikipedia.org/wiki/X-Forwarded-For – dankohn

16
// Get client IP address from request object ---------------------- 
getClientAddress = function (req) { 
     return (req.headers['x-forwarded-for'] || '').split(',')[0] 
     || req.connection.remoteAddress; 
}; 
+0

そして 'req'オブジェクトは何を保持していますか?私たちはそこに何を提供するのでしょうか? –

+2

信頼できる適切に設定されたプロキシサーバの背後にNode.JSサーバを置かない限り、 'req.headers ['x-forwarded-for']'はPCで簡単に操作できます。 'req.headers ['x-forwarded-for']'を尊重する前に、 'req.connection.remoteAddress'を既知の信頼できるプロキシサーバのリストと照合する必要があります。 –

+0

ORと分割加算を気に入ってください。これは、ロードバランサとキャッシングレイヤの両方の背後にアプリを持っている場合に適しています。 – KLVTZ

-1

クライアントにIPが非常に簡単です行き方:他のが原因プロキシの使用潜在的な使用に、指摘してきたように、あなたが本当にREQを使用する必要があります

var ip = req.headers['x-forwarded-for'] || 
    req.connection.remoteAddress || 
    req.socket.remoteAddress || 
    req.connection.socket.remoteAddress; 
    console.log(ip); 
+1

信頼できる適切に設定されたプロキシサーバの背後にNode.JSサーバを置かない限り、 'req.headers ['x-forwarded-for']'はPCで簡単に操作できます。 'req.headers ['x-forwarded-for']'を尊重する前に、 'req.connection.remoteAddress'を既知の信頼できるプロキシサーバのリストと照合する必要があります。複数のプロキシが含まれている場合、 'req.headers ['x-forwarded-for']'はコンマ区切りのリストを含むことができます。 –

1

非常に単純な

function getClientIP(req){ 
    return req.headers['x-forwarded-for'] || req.connection.remoteAddress; 
} 
+1

こんにちは、 './backend/api 'の次のコード' import {serverApi、createTodoApi}の直後に、私のserver.tsファイルに 'app.enable(' trust proxy '); app.get( '/ data.json'、serverApi); app.use( '/ api'、createTodoApi()); 'バックエンド/ api.tsファイルの' req.ip'変数にアクセスします。 ':: ffff:127.0.0.1'を返す場所です。これは有効なIPアドレスではないので、そこから場所を取得します。反応を待っています。ありがとう! –

0

を.ipと、多くの人が推薦しているように、X-Forwarded-Forヘッダーを使用しないでください。プロキシを信頼できるプロキシとして適切に構成する限り、req.ipは常にエンドユーザーのIPアドレスを返します。

あなたは8.8.8.8から接続されたプロキシを持っていた場合、あなたは何だろう:

var express = require('express'); 
var app = express(); 
app.set('trust proxy', '8.8.8.8'); 

プロキシを信頼しているので、これは今ではそう何X-Forwarded-Forヘッダー内渡されることになりますになるだろうreq.ipに格納されていますが、信頼できるプロキシの1つから発信された場合のみです。

信頼プロキシの詳細can be found here

今や、他の人がコメントで指摘したように、特にローカルで開発する場合は、 ":: ffff:127.0.0.1"の形式でipを取得することがあります。説明どおりに** ** [ノード-ipware](https://github.com/un33k/node-ipware)を使用することについてどのように

getClientAddress = function (req) { 
     return req.ip.split(":").pop(); 
}; 
関連する問題