在Koa.js中获取客户端IP

12

我有一个Koa应用程序,其中包含以下处理程序:

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

我需要获取客户端的IP地址来形成响应,如何分配clientIp使其指向请求来源的IP地址。

3个回答

17

Koa 1:

如果您没有设置反向代理,您可以像这样使用this.request.ip

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

此功能在请求文档中有详细说明。你可以始终通过this.request访问该request对象。

如果您使用反向代理,您将始终获得反向代理的IP地址。在这种情况下,需要在反向代理配置中添加一个特殊的头部,例如X-Orig-IP,其中包含原始客户端的IP地址。

然后,您可以在Koa中使用以下代码访问它:

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

Koa2:

处理方式相当相似,只是语法稍有不同:

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

@Qasim 我会添加一个例子。 - Uli Köhler
我得到了一个IPv6地址,是否可能获取IPv4地址? - chovy
@chovy,如果是这样的话,您的客户端将使用IPv6连接到服务器。为了避免这种情况,请在服务器上禁用IPv6。 - Uli Köhler

4
如果您添加app.proxy=true,则可以继续使用request.ip而不必担心IP头。

4

我曾经遇到过同样的问题,但是通过使用在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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接