컨트롤러 내에서 주어진 요청의 IP 주소를 어떻게 확인할 수 있습니까? 예를 들어 (명시 적으로) :
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
답변
당신의에서 request
객체라는 속성이 connection
A는, net.Socket
객체. net.Socket 객체에는 속성이 있으므로이 remoteAddress
호출로 IP를 얻을 수 있어야합니다.
request.connection.remoteAddress
편집하다
@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 전달 : client, proxy1, proxy2, proxy3
여기서 값은 쉼표 + 공백으로 구분 된 IP 주소 목록이며, 가장 왼쪽은 원래 클라이언트이며 요청을받은 각 연속 프록시는 요청을받은 IP 주소를 추가합니다. 이 예에서 요청은 proxy1
,proxy2
다음 proxy3
. proxy3
요청의 원격 주소로 나타납니다.
이것은 Arnav Gupta 가 Martin 이 x-forwarded-for
설정하지 않은 경우에 대한 주석에서 제안한 수정 사항으로 제안한 솔루션 입니다.
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
답변
답변
DRY 를 유지 하고 IPv4 및 IPv6을 모두 지원 하는 node-ipware 만 사용할 수 있습니다 .
설치:
npm install ipware
app.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 주소를 얻으려고 최선을 다하거나 사용자의 IP 주소를 127.0.0.1
확인할 수 없음을 표시하기 위해 돌아갑니다 . README 파일에서 고급 옵션을 살펴보십시오 .
답변
request-ip를 사용 하여 사용자의 IP 주소를 검색 할 수 있습니다 . 그것은 여러 가지 다른 경우를 처리하며, 그중 일부는 다른 답변에서 언급됩니다.
공개 :이 모듈을 만들었습니다
설치:
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();
};
도움이 되었기를 바랍니다
답변
request.headers['x-forwarded-for'] || request.connection.remoteAddress
경우 x-forwarded-for
헤더가 그 다음을 사용하고, 그렇지 않으면를 사용.remoteAddress
속성을.
x-forwarded-for
헤더에 설정 부하 분산 (또는 프록시 다른 유형)를 통과 요청에 추가 HTTP 또는 HTTPS (그것은에서 균형 때 요청에이 헤더를 추가 할 수도 있습니다 TCP의 사용 수준 프록시 프로토콜 ). request.connection.remoteAddress
속성에 클라이언트의 퍼블릭 IP 주소가 아닌로드 밸런서의 프라이빗 IP 주소가 포함 되기 때문 입니다. 위의 순서대로 OR 문 을 사용하여 x-forwarded-for
헤더 의 존재를 확인하고 존재 하는 경우이를 사용하십시오 request.connection.remoteAddress
.
답변
다음 기능은 모든 경우에 적용됩니다.
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);