我有一个Koa应用程序,其中包含以下处理程序:
router.get('/admin.html', function *(next) {
const clientIP = "?";
this.body = `Hello World ${clientIp}`;
});
我需要获取客户端的IP地址来形成响应,如何分配clientIp
使其指向请求来源的IP地址。
我有一个Koa应用程序,其中包含以下处理程序:
router.get('/admin.html', function *(next) {
const clientIP = "?";
this.body = `Hello World ${clientIp}`;
});
我需要获取客户端的IP地址来形成响应,如何分配clientIp
使其指向请求来源的IP地址。
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}`;
})
app.proxy=true
,则可以继续使用request.ip
而不必担心IP头。我曾经遇到过同样的问题,但是通过使用在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。