Как определить IP-адрес пользователя в узел
Как я могу определить IP-адрес данного запроса от контроллера? Например (в экспресс):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
14 ответов
в своем request
object существует свойство с именем connection
, который является net.Socket
"объект". Сеть.Объект Socket имеет свойство remoteAddress
, поэтому вы должны иметь возможность получить IP с этим вызовом:
request.connection.remoteAddress
см. документацию для адресу http и net
редактировать
как указывает @juand в комментариях, правильный метод для получения удаленного IP-адреса, если сервер находится за прокси-сервером, является request.headers['x-forwarded-for']
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
(req.connection.socket ? req.connection.socket.remoteAddress : null);
обратите внимание, что иногда вы можете получить более одного IP-адреса в req.headers['x-forwarded-for']
. Кроме того,x-forwarded-for
заголовок не всегда будет установлен, который может вызвать ошибку.
общий формат поля:
x-forwarded-for: client, proxy1, proxy2, proxy3
где значение представляет собой список IP-адресов, разделенных запятыми+пробелами, самый левый из которых является исходным клиентом, и каждый последующий прокси, который передал запрос, добавив IP-адрес, где он получил просьба от. В этом примере, запрос прошел через proxy1
, proxy2
, а потом proxy3
. proxy3
отображается как удаленный адрес запроса.
это предложение Arnav Гупти и Мартин предложил ниже в комментариях в случаях, когда x-forwarded-for
не установлено :
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
вы можете остановиться!--4-->сухой и просто использовать узел-ipware, который поддерживает как адрес IPv4 и протокол IPv6.
установка:
npm install ipware
в вашем приложении.js или промежуточное ПО:
var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
var ipInfo = getIP(req);
console.log(ipInfo);
// { clientIp: '127.0.0.1', clientIpRoutable: false }
next();
});
это сделает лучшую попытку получить IP-адрес пользователя или возвращает 127.0.0.1
, чтобы указать, что он не может определить IP-адрес пользователя. Взгляните на README файл для дополнительных опций.
можно использовать запрос-ip, чтобы получить IP-адрес пользователя. Он обрабатывает довольно много различных случаев edge, некоторые из которых упоминаются в других ответах.
раскрытие: я создал этот модуль
установка:
npm install request-ip
приложения:
var requestIp = require('request-ip');
// inside middleware handler
var ipMiddleware = function(req, res, next) {
var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1
next();
};
надеюсь, что это помогает
следующая функция имеет все случаи, охватываемые поможет
var ip;
if (req.headers['x-forwarded-for']) {
ip = req.headers['x-forwarded-for'].split(",")[0];
} else if (req.connection && req.connection.remoteAddress) {
ip = req.connection.remoteAddress;
} else {
ip = req.ip;
}console.log("client IP is *********************" + ip);
request.headers['x-forwarded-for'] || request.connection.remoteAddress
если x-forwarded-for
заголовок есть, то используйте это, иначе используйте .remoteAddress
собственность.
на x-forwarded-for
заголовок добавляется к запросам, которые проходят через балансировщики нагрузки (или другие типы прокси), настроенные для адресу http или HTTPS (также можно добавить этот заголовок в запросы при балансировке на TCP уровень с помощью прокси-протокол). Это потому что request.connection.remoteAddress
свойство будет содержать частный ip-адрес балансировщика нагрузки, а не общедоступный ip-адрес клиента. Используя или заявление, в порядке выше, вы проверяете наличие x-forwarded-for
заголовок и использовать его, если он существует, в противном случае использовать request.connection.remoteAddress
.
Если вы используете express версии 3.x или больше, вы можете использовать параметр прокси-сервера доверия (http://expressjs.com/api.html#trust.proxy.options.table) и он будет ходить по цепочке адресов в заголовке X-forwarded-for и помещать последний ip-адрес в цепочку, которую вы не настроили в качестве доверенного прокси-сервера, в IP-свойство объекта req.
function getCallerIP(request) {
var ip = request.headers['x-forwarded-for'] ||
request.connection.remoteAddress ||
request.socket.remoteAddress ||
request.connection.socket.remoteAddress;
ip = ip.split(',')[0];
ip = ip.split(':').slice(-1); //in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx"
return ip;
}
есть два способа получить IP-адрес :
let ip = req.ip
let ip = req.connection.remoteAddress;
но есть проблема с выше подхода.
если вы используете приложение за Nginx или любой прокси, каждый IP-адрес будет 127.0.0.1
.
Итак, лучшее решение для получения ip-адреса пользователя: -
let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
просто получить удаленный ip в nodejs:
var ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
Если вы получаете несколько IPs, это работает для меня:
var ipaddress = (req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress).split(",")[0];
Я понимаю, что на это ответили до смерти, но вот современная версия ES6, которую я написал, которая следует стандартам Airbnb-base eslint.
const getIpAddressFromRequest = (request) => {
let ipAddr = request.connection.remoteAddress;
if (request.headers && request.headers['x-forwarded-for']) {
[ipAddr] = request.headers['x-forwarded-for'].split(',');
}
return ipAddr;
};
заголовок X-Forwarded-For может содержать разделенный запятыми список IP-адресов прокси. Заказ-клиент,proxy1,proxy2,...,proxyN. В реальном мире люди реализуют прокси, которые могут предоставить все, что они хотят в этом заголовке. Если вы находитесь за балансировщиком нагрузки или чем-то еще, вы можете по крайней мере доверять первому IP-адресу в списке, по крайней мере, независимо прокси какой-то запрос пришел.
была та же проблема...im также новый в javascript, но я решил это с req.соединение.remoteAddress; это дало мне IP-адрес (но в формате ipv6:: ffff.192.168.0.101 ), а потом .ломтик удалить 7 первых цифр.
var ip = req.connection.remoteAddress;
if (ip.length < 15)
{
ip = ip;
}
else
{
var nyIP = ip.slice(7);
ip = nyIP;
}