特にノードの場合、httpサーバーコンポーネントのドキュメントでは、イベント接続の下で次のように述べています。
[トリガー]新しいTCPストリームが確立されたとき。[the]ソケットは、net.Socketタイプのオブジェクトです。通常、ユーザーはこのイベントにアクセスしたくないでしょう。特に、プロトコルパーサーがソケットに接続する方法が原因で、ソケットは読み取り可能なイベントを発行しません。ソケットはからもアクセスできますrequest.connection
。
つまり、これrequest.connection
はソケットであり、ドキュメントによれば、実際にはsocket.remoteAddress属性があり、ドキュメントによれば次のとおりです。
リモートIPアドレスの文字列表現。たとえば、「74.125.127.100」または「2001:4860:a005 :: 68」です。
Expressでは、リクエストオブジェクトはNode httpリクエストオブジェクトのインスタンスでもあるため、このアプローチは引き続き機能します。
ただし、Express.jsでは、リクエストにはすでに2つの属性(req.ipとreq.ips)があります。
req.ip
リモートアドレスを返すか、「信頼プロキシ」が有効になっている場合-アップストリームアドレス。
req.ips
ときに「信頼プロキシは」であるtrue
、そうでない場合は空の配列が返され、「X-転送さ-については、」IPアドレスリストを解析し、配列を返します。たとえば、値が "client、proxy1、proxy2"の場合、配列["client"、 "proxy1"、 "proxy2"]が返されます。ここで、「proxy2」は最も下流にあります。
私の理解によれば、Express req.ip
は実際のクライアントIPが含まれているreq.connection.remoteAddress
ためreq.ip
(信頼できるプロキシがExpressで有効になっている場合)、の方がプロキシのIPアドレスを含む可能性があるため(ある場合) 1)。
これが、現在受け入れられている回答が示唆している理由です。
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
これreq.headers['x-forwarded-for']
は、expressに相当しreq.ip
ます。