[Node.js] Express.js:如何獲取遠程客戶端地址


Answers

雖然@alessioalex的答案是有效的,但Express - 指南的 代理部分後面Express中提供了另一種方法。

  1. app.enable('trust proxy')到您的快速初始化代碼中。
  2. 當你想獲得遠程客戶端的IP地址時,以通常的方式使用req.ipreq.ips (就好像沒有反向代理一樣)

如果您需要比信任所有在x-forwarded-for標頭中傳遞的內容更複雜的信息,並且您的代理不會從不受信任的來源中移除預先存在的x-forwarded-for標頭,則可以使用“信任代理”的更多選項。 有關更多詳細信息,請參閱鏈接指南

注意: req.connection.remoteAddress不適用於我的解決方案。

Question

我不完全了解我應該如何獲得遠程用戶IP地址。

假設我有一個簡單的請求路由,例如:

app.get(/, function (req, res){
   var forwardedIpsStr = req.header('x-forwarded-for');
   var IP = '';

   if (forwardedIpsStr) {
      IP = forwardedIps = forwardedIpsStr.split(',')[0];  
   }
});

上述方法是否正確以獲得真實的用戶IP地址還是有更好的方法? 那麼代理呢?




特別是對於節點,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.ipreq.ip

req.ip

返回遠程地址,或啟用“信任代理”時 - 上游地址。

req.ips

“信任代理”true ,解析“X-Forwarded-For”IP地址列表並返回一個數組,否則返回一個空數組。 例如,如果值為“client,proxy1,proxy2”,您將收到數組[“client”,“proxy1”,“proxy2”],其中“proxy2”是最下游的數據流。

根據我的理解,值得一提的是,根據我的理解,Express req.ipreq.connection.remoteAddress更好,因為req.ip包含實際的客戶端IP(假設在express中啟用了可信代理),而其他可能包含代理的IP地址(如果有的話)。

這就是為什麼目前接受的答案表明:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

req.headers['x-forwarded-for']將等同於express req.ip




  1. 添加app.set('trust proxy', true)
  2. 以通常的方式使用req.ipreq.ips



var ip = req.connection.remoteAddress;

ip = ip.split(':')[3];