Node / Express是否重新定义request.ip?

我有一个合法的业务需求来testing我们的服务器使用假IP地址的方式。 我们在一些不同的地方使用request.ip ,我不想用假IP地址replace每个“request.ip”的实例,所以我想我只是在应用程序的入口点重新定义它(开始的callback链)。 但是,当request.ip显然变回“127.0.0.1”时,我遇到了一些意想不到的行为!

这是插入到“句柄”方法中的(CoffeeScript)代码:

 spanishIp ='37.35.128.128' request.ip = spanishIp console.log "ip: #{request.ip} / #{spanishIp}" 

导致以下日志:

 ip: 127.0.0.1 / 37.35.128.128 

显然, request.ip被重新定义回到我的实际IP地址(127.0.0.1)之间,并将其设置为“37.35.128.128”和console.log语句。

当我将代码更进一步地移入callback链时,它按预期工作。

Node / Express是否有可能在运行时反复将request.ip设置为用户的实际IP地址的内部机制?

express中的req.ip属性总是通过函数调用从req.ips数组中获取,它是从X-Forwarded-For头构build的。

Node.js:获取客户端的IP

https://github.com/strongloop/express/blob/master/lib/request.js#L285-L287

所以当你询问req.ip时,总会返回req.ips数组的值。 也就是说,你不能“设置”req.ip属性。 您需要改为使用请求主体,如req.body.ip如果您需要手动执行任何操作。

尝试通过摆弄node / expressjs的核心function来欺骗ip地址听起来不是正确的方法。 我会build议你,而不是在你的应用程序中启用'trust proxy' ,然后通过使用X-Forwarded-*标头来欺骗IP地址。 看到这个更多的细节。

编辑:

如果你真的想mock传入请求的IP地址,那么可能值得看这个 。 同样,我不认为node / expressjs是为了任何目的而修改req.ip的。