特にノードの場合、イベント接続の下のhttpサーバーコンポーネントのドキュメントには次のように記載されています。
[トリガー] 新しい TCP ストリームが確立されたとき。[The] socket は net.Socket 型のオブジェクトです。通常、ユーザーはこのイベントにアクセスしたくないでしょう。特に、プロトコルパーサーがソケットに接続する方法が原因で、ソケットは読み取り可能なイベントを発行しません。ソケットには からもアクセスできますrequest.connection
。
したがって、それはrequest.connection
ソケットであることを意味し、ドキュメントによると、実際にはsocket.remoteAddress属性があり、ドキュメントによると次のとおりです。
リモート IP アドレスの文字列表現。たとえば、「74.125.127.100」または「2001:4860:a005::68」です。
Express では、リクエスト オブジェクトは Node http リクエスト オブジェクトのインスタンスでもあるため、このアプローチは引き続き機能します。
ただし、Express.js では、リクエストにはすでにreq.ipとreq.ipsの 2 つの属性があります。
req.ip
リモートアドレスを返すか、「トラストプロキシ」が有効になっている場合はアップストリームアドレスを返します。
req.ips
「trust proxy」がの場合true
、「X-Forwarded-For」IP アドレス リストを解析して配列を返します。それ以外の場合は、空の配列が返されます。たとえば、値が「クライアント、プロキシ 1、プロキシ 2」の場合、配列 [「クライアント」、「プロキシ 1」、「プロキシ 2」] を受け取ります。ここで、「プロキシ 2」は最も下流です。
私の理解によれば、 Expressreq.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
。