在Koa.js中获取客户端IP

时间:2016-06-07 20:27:32

标签: javascript node.js koa

我有一个像这样的处理程序的Koa应用程序:

router.get('/admin.html', function *(next) {
    const clientIP = "?";
    this.body = `Hello World ${clientIp}`;
});

我需要获取客户端的IP地址才能形成响应。如何分配clientIp,以便它引用请求所源自的IP地址。

3 个答案:

答案 0 :(得分:7)

Koa 1:

假设您没有反向代理,您可以使用this.request.ip,如下所示:

router.get('/admin.html', function *(next) {
    const clientIP = this.request.ip;
    this.body = `Hello World ${clientIP}`;
});

request文档中记录了此功能。您始终可以将request对象视为this.request

如果您有反向代理,您将始终获得反向代理的IP地址。在这种情况下,它更棘手:在反向代理配置中,您需要添加一个特殊的标头,例如X-Orig-IP与原始客户端IP。

然后,您可以使用以下方式在koa中访问它:

const clientIp = this.request.headers["X-Orig-IP"];

Koa 2:

方法非常相似,只是语法略有不同:

router.get('/', async (ctx, next) => {
    const clientIP = ctx.request.ip;
    ctx.body = `Hello World ${clientIP}`;
})

答案 1 :(得分:2)

如果你添加 app.proxy=true 您仍然可以使用request.ip而无需担心IP标头。

答案 2 :(得分:1)

我遇到了同样的问题,但通过使用在 NPM 上找到的这个模块解决了它 request-ip

在 koa 中可以简单地使用 userIp = requestIp.getClientIp(ctx.request)

用户ip由以下顺序确定:

X-Client-IP
X-Forwarded-For (Header may return multiple IP addresses in the format: "client IP, proxy 1 IP, proxy 2 IP", so we take the the first one.)
CF-Connecting-IP (Cloudflare)
Fastly-Client-Ip (Fastly CDN and Firebase hosting header when forwared to a cloud function)
True-Client-Ip (Akamai and Cloudflare)
X-Real-IP (Nginx proxy/FastCGI)
X-Cluster-Client-IP (Rackspace LB, Riverbed Stingray)
X-Forwarded, Forwarded-For and Forwarded (Variations of #2)
req.connection.remoteAddress
req.socket.remoteAddress
req.connection.socket.remoteAddress
req.info.remoteAddress

如果找不到 IP 地址,则返回 null。