2013-10-09 262 views
24

req.connection.remoteAddress,req.headers ['x-forwarded-for'],req.ip,req.ips,這是什麼意思?Node.js:獲取客戶端IP

是否有簡單的方法來獲取客戶端/用戶代理的IP地址,向Node.js/Express發出請求到我的站點?我不理解所有代理的東西或者req對象的所有屬性之間的所有差異。另外,我不明白什麼'信任代理'選項是爲Express。

有人能給我一個直截了當的解釋,所有這些屬性之間的區別是什麼,並回答我如何才能簡單地獲得客戶的IP?

+0

如何使用** [節點ipware(https://github.com/un33k/node-ipware)**按說明** [這裏](http://stackoverflow.com/a/26310355/458879)**。 – un33k

回答

46

req.ip是以Express方式獲取客戶端IP地址的直接方式。您可以看到它使用的邏輯(其中涉及從代理地址req.ips的陣列中抓取第一項,其中該陣列由x-forwarded-for標題構建)here

+0

你能描述一下x-forwarded-for是什麼嗎? – Sam

+1

服務器前面的每個代理都會添加x-forwarded-for標頭。這裏有更多的信息:http://en.wikipedia.org/wiki/X-Forwarded-For – dankohn

16
// Get client IP address from request object ---------------------- 
getClientAddress = function (req) { 
     return (req.headers['x-forwarded-for'] || '').split(',')[0] 
     || req.connection.remoteAddress; 
}; 
+0

什麼'req'對象擁有,我的意思是我們在那裏提供什麼? –

+2

請注意''req.headers ['x-forwarded-for']'很容易在PC上操作,除非您已將Node.JS服務器放置在可信和正確配置的代理服務器之後。在尊重'req.headers ['x-forwarded-for']'之前,您應該首先檢查'req.connection.remoteAddress'對已知可信代理服務器的列表。 –

+0

欣賞OR和拆分補充。如果您的應用程序支持負載均衡器和/或緩存層,這很好。 – KLVTZ

-1

獲取客戶端的IP是非常簡單的:

var ip = req.headers['x-forwarded-for'] || 
    req.connection.remoteAddress || 
    req.socket.remoteAddress || 
    req.connection.socket.remoteAddress; 
    console.log(ip); 
+1

請注意'req.headers ['x-forwarded-for']'很容易在PC上操作,除非您已將Node.JS服務器放置在可信和正確配置的代理服務器之後。在尊重'req.headers ['x-forwarded-for']'之前,您應該首先檢查'req.connection.remoteAddress'對已知可信代理服務器的列表。如果涉及多個代理,則req.headers ['x-forwarded-for']'可能包含逗號分隔的列表。 –

1

很簡單

function getClientIP(req){ 
    return req.headers['x-forwarded-for'] || req.connection.remoteAddress; 
} 
+1

嗨,我已經放置'app.enable('信任代理');'在我的server.ts文件中'我的下面的代碼'從'./backend/api'導入{serverApi,createTodoApi}; app.get('/ data.json',serverApi); app.use('/ api',createTodoApi());'並在我的後端/ api.ts文件中訪問變量'req.ip'。在返回':: ffff:127.0.0.1'的地方,它不是一個有效的IP地址來獲取它的位置。等待你的答覆。謝謝! –

0

至於其他的已經指出,由於使用了潛在代理的使用,你真的應該使用REQ .ip,而不是像許多人推薦的那樣使用X-Forwarded-For頭。只要您將代理正確配置爲受信任的代理,req.ip將始終返回最終用戶的IP地址。

例如如果你有一個從8.8.8.8連接代理,你會怎麼做:

var express = require('express'); 
var app = express(); 
app.set('trust proxy', '8.8.8.8'); 

既然你信任的代理,這將現在讓它有啥在X - 轉發,對於頭傳遞會存儲在req.ip中,但只有它來自可信代理之一。

更多關於信任代理can be found here

現在,正如其他人在評論中指出的那樣;特別是在本地開發時,您可能會以「:: ffff:127.0.0.1」的格式獲取IP。

要始終獲得IPv4地址我:

getClientAddress = function (req) { 
     return req.ip.split(":").pop(); 
};