我有一个像这样的处理程序的Koa应用程序:
router.get('/admin.html', function *(next) {
const clientIP = "?";
this.body = `Hello World ${clientIp}`;
});
我需要获取客户端的IP地址才能形成响应。如何分配clientIp
,以便它引用请求所源自的IP地址。
答案 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。