Я не совсем понимаю, как я должен получить IP-адрес удаленного пользователя.
Допустим, у меня есть простой маршрут запроса, такой как:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
Правильный ли приведенный выше подход для получения реального IP-адреса пользователя или есть лучший способ? А как насчет прокси?
node.js
express
ip
ip-address
Erik
источник
источник
Ответы:
Если вы работаете за прокси-сервером, таким как NGiNX или что-то еще, только тогда вы должны проверить «x-forwarded-for»:
Если прокси не «ваш», я бы не стал доверять заголовку «x-forwarded-for», потому что он может быть подделан.
источник
proxy_set_header X-Forwarded-For $remote_addr;
в вашу конфигурацию nginx, если вы используете свой собственный обратный прокси.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
чтобы получить клиентский IP.Хотя ответ @alessioalex работает, существует другой способ, указанный в разделе « Экспресс за прокси » руководства Express .
app.set('trust proxy', true)
к вашему коду экспресс-инициализации.req.ip
илиreq.ips
обычным способом (как если бы не было обратного прокси)Дополнительное чтение:
req.ip
илиreq.ips
.req.connection.remoteAddress
не работает с этим решением.'trust proxy'
Доступно больше опций для , если вам нужно что-то более сложное, чем доверять всему, что пропущено вx-forwarded-for
заголовке (например, когда ваш прокси не удаляет существующий заголовок x-forwarded-for из ненадежных источников). Смотрите связанное руководство для более подробной информации.x-forwarded-for
заголовок, есть две возможности.proxy_set_header X-Forwarded-For $remote_addr;
в свою конфигурацию.источник
app.enable('trust proxy')
тоже работает, чтобы использоватьreq.ip
. За исключением того, что у меня есть порт с ним1.2.3.4:56789
. Чтобы избавиться от этого, я делаюvar ip = req.ip.split(':')[0]
В
nginx.conf
файле:proxy_set_header X-Real-IP $remote_addr;
В
node.js
файле сервера:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
обратите внимание, что выражают заголовки в нижнем регистре
источник
req.headers['x-real-ip']
даже вnginx.conf
заголовке, он указан заглавными буквами.В частности, для узла документация для компонента http-сервера в разделе подключения к событиям гласит:
Таким образом, это означает, что
request.connection
это сокет, и, согласно документации, действительно есть атрибут socket.remoteAddress, который согласно документации:В экспрессе объект запроса также является экземпляром объекта запроса http узла, поэтому этот подход все еще должен работать.
Однако в Express.js запрос уже имеет два атрибута: req.ip и req.ips
Возможно, стоит упомянуть, что, по моему мнению, Express
req.ip
является более подходящим подходом, чемreq.connection.remoteAddress
, поскольку онreq.ip
содержит фактический ip клиента (при условии, что доверенный прокси-сервер включен в Express), тогда как другой может содержать IP-адрес прокси-сервера (если есть). один).Вот почему в настоящее время принятый ответ предполагает:
req.headers['x-forwarded-for']
Будет эквивалентна экспрессreq.ip
.источник
app.set('trust proxy', true)
req.ip
илиreq.ips
обычным способомисточник
Это просто дополнительная информация для этого ответа .
Если вы используете
nginx
, вы бы добавитьproxy_set_header X-Real-IP $remote_addr;
в блок местоположения для сайта./etc/nginx/sites-available/www.example.com
например. Вот пример блока сервера.После перезапуска
nginx
вы сможете получить доступ к ip в маршрутах вашегоnode
/express
приложения сreq.headers['x-real-ip'] || req.connection.remoteAddress;
источник
По словам Express за прокси ,
req.ip
учел обратный прокси, если вы настроилиtrust proxy
правильно. Поэтому это лучше, чем то,req.connection.remoteAddress
что получается с сетевого уровня и не знает прокси.источник
Я написал пакет для этой цели. Вы можете использовать его в качестве промежуточного программного обеспечения. Мой пакет опубликован здесь: https://www.npmjs.com/package/express-ip
Вы можете установить модуль используя
использование
источник
Я знаю, что на этот вопрос ответили, но вот как я заставил свою работу работать.
источник
Если у вас все в порядке с использованием сторонней библиотеки. Можете проверить request-ip .
Вы можете использовать это по
Исходный код довольно длинный, поэтому я не буду копировать здесь, вы можете проверить на https://github.com/pbojinov/request-ip/blob/master/src/index.js
В принципе,
Раскрыть: я не связан с библиотекой.
источник
Это сработало для меня лучше, чем остальные. Мои сайты отстают от CloudFlare и, похоже, требуют
cf-connecting-ip
.Не проверял Express за прокси, так как он ничего не говорил об этом
cf-connecting-ip
заголовке.источник
С поддержкой-flare, nginx и x-real-ip
источник
В моем случае, аналогично этому решению, я использовал следующий подход x-forwarded-for :
x-forwarded-for
В заголовке будет продолжаться добавление маршрута IP от источника до конечного целевого сервера, поэтому, если вам нужно получить IP клиента источника, это будет первый элемент массива.источник
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
источник
ip = ip.split(':').pop();
будет бэттер в этом случае, если придет нормальный ip, т.е. 127.0.0.1. Он все еще сможет дать вам ip.У объекта заголовков есть все, что вам нужно, просто сделайте это:
источник
Собираем все вместе с помощью решения @kakopappa и
morgan
регистрируем IP-адрес клиента:источник