如果是HTTPS请求,如何在node.js中找到远程地址?

10

你好。在node.js中,如果是http请求,我可以通过req.connection.remoteAddress获取远程地址。

那么,如果是https请求,如何获取它呢?我发现有req.socket.remoteAddress,但不确定是否正确。请给予建议。谢谢。


你是在使用HTTP服务器还是发起一个HTTP请求? - Raynos
请查看此处:http://nodejs.org/docs/v0.3.7/api/https.html - Avitus
所以,当HTTP请求到来时,我想知道远程IP地址。它通常不会出现在req.connection中。我看到有req.socket.remoteAddress,但不确定是否应该使用它。 :) - murvinlai
你确定你正在进行正确的HTTPS Ajax请求吗? - Raynos
4个回答

19

看起来确实出了点问题。
从Node 0.4.7开始,似乎HTTP在以下情况下具有remoteAddress可用:

  • req.connection.remoteAddress
  • req.socket.remoteAddress

在https上,这两个都是未定义的,但是

  • req.connection.socket.remoteAddress

确实有效。 但是它在http上不可用,所以您需要仔细检查。 我无法想象这种行为是有意的。


它们都不适用于0.6.x版本。如何从http.createServer的请求中获取远程IP地址? - Redsandro
2
跳过那个 - connection.remoteAddress 是可用的,只是在 Eclipse 调试器中没有列出。不知道为什么。 - Redsandro
我尝试了req.connection.socket.remoteAddress,而且它在https上运行,这似乎很奇怪。 - Louie Miranda

10

由于直接谷歌搜索“express js ip”会直接跳转到这里,所以这个问题与此有关。

Express 3.0.0 alpha 现在提供了一种新的方法来获取客户端请求的IP地址。只需使用 req.ip 即可。如果您正在进行一些代理操作,您可能会对 app.set("trust proxy", true);req.ips 感兴趣。

我建议您阅读 Express Google Group 中的整个讨论。


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

注意,当使用移动设备连接您的服务器(wifi和运营商数据)时,有时可以在req.headers ['x-forwarded-for']中获取多个IP地址。

其他需要考虑的头文件:'x-cluster-client-ip'(rackspace LB)和 'x-real-ip'(默认的nginx代理/fcgi)。 - zamnuts

3

另外,req.headers['x-forwarded-for'] 很容易被篡改,因此您需要一个配置正确的代理服务器。

在使用 req.headers['x-forwarded-for'] 之前,最好先将 req.connection.remoteAddress 与已知代理服务器列表进行检查。


非常好的观察。您认为有没有办法从请求中确定它是代理还是终端客户端? - Brian

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