โดยเฉพาะอย่างยิ่งสำหรับโหนดเอกสารสำหรับส่วนประกอบเซิร์ฟเวอร์ http ภายใต้การเชื่อมต่อเหตุการณ์พูดว่า:
[ทริกเกอร์] เมื่อสร้างสตรีม TCP ใหม่ [The] ซ็อกเก็ตเป็นวัตถุประเภท netSocket โดยปกติผู้ใช้จะไม่ต้องการเข้าถึงกิจกรรมนี้ โดยเฉพาะอย่างยิ่งซ็อกเก็ตจะไม่ปล่อยเหตุการณ์ที่อ่านได้เนื่องจากวิธีการแยกวิเคราะห์โปรโตคอลแนบกับซ็อกเก็ต request.connection
ซ็อกเก็ตนอกจากนี้ยังสามารถเข้าถึงได้
ดังนั้นนั่นหมายถึงrequest.connection
ซ็อกเก็ตและตามเอกสารมีแน่นอนsocket.remoteAddressแอตทริบิวต์ซึ่งตามเอกสารประกอบคือ:
การแสดงสตริงของที่อยู่ IP ระยะไกล ตัวอย่างเช่น '74 .125.127.100 'หรือ' 2001: 4860: a005 :: 68 '
ภายใต้ด่วนวัตถุขอเป็นตัวอย่างของวัตถุคำขอ http http ดังนั้นวิธีนี้ยังคงทำงาน
อย่างไรก็ตามภายใต้ Express.js คำขอมีสองแอตทริบิวต์: req.ipและreq.ips
req.ip
ส่งคืนที่อยู่ระยะไกลหรือเมื่อเปิดใช้งาน "trust proxy" - ที่อยู่ต้นน้ำ
req.ips
เมื่อ"พร็อกซี่ไว้วางใจ"เป็นtrue
แยก "X-Forwarded-For" รายการที่อยู่ IP และกลับอาร์เรย์มิฉะนั้นอาร์เรย์ที่ว่างเปล่าจะถูกส่งกลับ ตัวอย่างเช่นหากค่าเป็น "client, proxy1, proxy2" คุณจะได้รับอาร์เรย์ ["ลูกค้า", "proxy1", "proxy2"] โดยที่ "proxy2" เป็น down-stream ที่ไกลที่สุด
อาจเป็นมูลค่าการกล่าวขวัญว่าตามความเข้าใจของฉัน Express req.ip
เป็นวิธีที่ดีกว่าreq.connection.remoteAddress
เนื่องจากreq.ip
มี IP ไคลเอ็นต์จริง (หากเปิดใช้งานพร็อกซีที่เชื่อถือได้ในด่วน) ในขณะที่อีกอันอาจมีที่อยู่ IP ของพร็อกซี (ถ้ามี หนึ่ง).
นั่นคือเหตุผลที่คำตอบที่ยอมรับในปัจจุบันแนะนำ:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
จะเทียบเท่าด่วนreq.headers['x-forwarded-for']
req.ip