Node.js: получить клиентский IP-адрес
req.connection.remoteAddress, req.headers ['x-forwarded-for'], req.ip, req.ips, что все это значит?
Есть ли прямой способ просто получить IP-адрес клиента/пользователя-агента, делающего запрос на мой сайт в Node.js/Express? Я не понимаю все прокси-материалы или все различия между всеми свойствами объекта req. Кроме того, я не понимаю, что такое "доверенный прокси" для Express.
Может кто-нибудь дать мне прямое объяснение тому, что разница между всеми этими свойствами, и ответить, как я могу просто получить IP-адрес клиента?
Ответы
Ответ 1
req.ip
- это простой способ получить IP-адрес клиента в Express. Вы можете увидеть используемую им логику (которая включает захват первого элемента из массива прокси-адресов req.ips
, где этот массив построен из заголовков x-forwarded-for
) здесь.
Ответ 2
// Get client IP address from request object ----------------------
getClientAddress = function (req) {
return (req.headers['x-forwarded-for'] || '').split(',')[0]
|| req.connection.remoteAddress;
};
Ответ 3
очень просто
function getClientIP(req){
return req.headers['x-forwarded-for'] || req.connection.remoteAddress;
}
Ответ 4
Как отмечали другие, из-за использования потенциального использования прокси, вы действительно должны использовать 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-Forwarded-For, будет храниться в req.ip, но ТОЛЬКО, если оно происходит от одного из доверенных прокси.
Подробнее о доверенном прокси можно найти здесь.
Теперь, как отмечали другие в комментариях; особенно при разработке локально вы можете получить ip в формате ":: ffff: 127.0.0.1".
Чтобы всегда получать адрес IPv4, у меня есть:
getClientAddress = function (req) {
return req.ip.split(":").pop();
};
Ответ 5
Получение IP-адреса клиента довольно просто:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
console.log(ip);