2013-10-09 3 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 - это простой способ получить IP-адрес клиента в Express. Вы можете увидеть используемую им логику (которая включает захват первого элемента из массива прокси-адресов 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']' легко обрабатывается на ПК, если вы не разместили ваш Node.JS-сервер за доверенным и правильно настроенным прокси-сервером. Вы должны сначала проверить 'req.connection.remoteAddress' на список известных доверенных прокси-серверов, прежде чем соблюдать' req.headers ['x-forwarded-for'] '. –

+0

Цените добавления OR и split. Это хорошо, если у вас есть приложение как для балансировки нагрузки, так и для слоя кеширования. – 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']' легко обрабатывается на ПК, если вы не разместили ваш Node.JS-сервер за доверенным и правильно настроенным прокси-сервером. Вы должны сначала проверить 'req.connection.remoteAddress' на список известных доверенных прокси-серверов, прежде чем соблюдать' req.headers ['x-forwarded-for'] '. Если задействовано несколько прокси, то 'req.headers ['x-forwarded-for']' может содержать список, разделенный запятыми. –

1

очень просто

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

Привет, я разместил 'app.enable ('trust proxy');' в моем файле server.ts сразу после моего следующего кода 'import {serverApi, createTodoApi} из './backend/api'; app.get ('/ data.json', serverApi); app.use ('/ api', createTodoApi()); 'и доступ к переменным' req.ip' в моем файле backend/api.ts. Где его возвращающий ':: 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-Forwarded-For будет хранится в req.ip, но ТОЛЬКО, если оно происходит от одного из доверенных прокси.

Подробнее о доверенном доверенности can be found here.

Теперь, как отмечают другие в комментариях; особенно при разработке локально вы можете получить ip в формате «:: ffff: 127.0.0.1».

Чтобы всегда получить адреса IPv4 у меня есть:

getClientAddress = function (req) { 
     return req.ip.split(":").pop(); 
}; 
Смежные вопросы