Riêng với nút, tài liệu cho thành phần máy chủ http, trong kết nối sự kiện cho biết:
[Kích hoạt] khi một luồng TCP mới được thiết lập. Ổ cắm [là] một đối tượng của loại net.Socket. Thông thường người dùng sẽ không muốn truy cập sự kiện này. Cụ thể, ổ cắm sẽ không phát ra các sự kiện có thể đọc được do cách trình phân tích cú pháp giao thức gắn vào ổ cắm. Các ổ cắm cũng có thể được truy cập tại request.connection
.
Vì vậy, điều đó có nghĩa request.connection
là một ổ cắm và theo tài liệu thực sự có một thuộc tính socket.remoteAddress mà theo tài liệu này là:
Chuỗi đại diện của địa chỉ IP từ xa. Ví dụ: '74 .125.127.100 'hoặc' 2001: 4860: a005 :: 68 '.
Theo express, đối tượng yêu cầu cũng là một thể hiện của đối tượng yêu cầu Node http, vì vậy phương pháp này vẫn hoạt động.
Tuy nhiên, trong Express.js, yêu cầu đã có hai thuộc tính: req.ip và req.ips
req.ip
Trả lại địa chỉ từ xa hoặc khi "proxy ủy thác" được bật - địa chỉ ngược dòng.
req.ips
Khi "proxy ủy thác" là true
, phân tích danh sách địa chỉ IP "X-Forwarded-For" và trả về một mảng, nếu không thì một mảng trống được trả về. Ví dụ: nếu giá trị là "client, proxy1, proxy2", bạn sẽ nhận được mảng ["client", "proxy1", "proxy2"] trong đó "proxy2" là luồng xuống xa nhất.
Theo tôi hiểu, có thể đáng nói rằng, Express req.ip
là cách tiếp cận tốt hơn so với req.connection.remoteAddress
, vì req.ip
chứa ip máy khách thực tế (với điều kiện proxy đáng tin cậy được bật nhanh), trong khi cái kia có thể chứa địa chỉ IP của proxy (nếu có một).
Đó là lý do tại sao câu trả lời hiện được chấp nhận cho thấy:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
Các req.headers['x-forwarded-for']
sẽ tương đương với tốc req.ip
.