2016-07-27 1215 views

回答

3

req.ip会尽量同时考虑到由指示请求的来源(客户端)(代理服务器设置,尽管这只会做,如果trust proxy设定明确启用帐户标题来解决实际的客户机IP地址)。

req.connection.remoteAddress将包含发出请求的客户端的IP地址,在代理服务器的情况下,该代理服务器将是代理的IP地址,而不是代理服务器代表其转发请求的客户端的IP地址。

如果您使用的是将请求转发到Express服务器的逆向代理,则req.ip和启用trust proxy是最佳解决方案。否则,只是简单的req.ip仍然会这样做。让用户IP

2

最好的办法是req.headers['x-forwarded-for'] || req.connection.remoteAddress;

这样var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

,因为可能是你将使用的中间件(或最常用的代理),出于安全原因,服务器(如CloudFlare的),如果你使用req.connection.remoteAddress它会每次发送中间件服务器的IP地址,但是您可以一起使用x-forwarded-for标头和req.connection.remoteAddressreq.ip

更多信息,请阅读有关x-forwarded-for http header

编辑

在下面的评论使用req.ip || req.connection.remoteAddress最佳实践提及;因为即使您在没有代理的情况下使用应用程序,将来也可以将其与代理一起使用,并使用上述方法,您可以在不更改它的情况下使用应用程序

+0

我没有使用代理服务器,所以如果不使用我应该使用的代理服务器,以及如果将来使用代理服务器,我应该使用哪一个? (如果您可以编辑您的答案以适应我刚刚提出的问题,将有助于未来遇到同样问题的人员。) – guyforlowbro

+0

@guyforlowbro,为清晰起见进行更新。 –

+0

但要小心,据我了解,'x-forwaded-for'标头可能包含多个ip(如果您的快速应用程序位于代理之后)。所以我想坚持'req.ip'是要走的路 – lascort