在Node的Hapi.js中获取请求的客户端IP地址

3

我需要在hapijs node中的请求中获取客户端的IP地址...我们使用pm2和Nginx来运行服务器,并使用request.info.address,但它只提供服务器的本地ip地址127.0.0.1,而我需要的是使用我的应用程序的客户端的IP地址,例如:192.x.x.111。


可能是重复的问题:如何在Node中确定用户的IP地址 - str
4个回答

4

您需要检查反向代理(nginx)的配置,看看是否正在发送IP以及如何发送。

例如(nginx conf):

server {
    listen       0.0.0.0:80;
    server_name  [your_domain];
    root /webroot/[your_domain or webapp name];
    access_log  /var/log/nginx/[your_domain or webapp name].log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://127.0.0.1:[port assigned to node];
        proxy_redirect off;
    }
}

在这种情况下,您将通过标头X-Real-IP获取客户端的IP地址。
因此,在HapiJS中,您可以访问request对象:
const ip = request.headers['x-real-ip'] || request.info.remoteAddress;

4

如果您的服务器在 Nginx 反向代理服务器后面运行,则需要使用以下命令:

    req.headers['x-real-ip']

另外你可以使用:
req.info.remoteAddress

我尝试了这个,但仍然返回 Undefined。我需要在我的 ajax 中添加任何额外的头部特性才能在处理程序中获取 IP,还是在 Hapi.Js 中获取 IP 的方法有什么特殊之处,因为我搜索到的所有答案大多适用于 express.js。 - sunilsmith
最好的方法是在控制台中输出您的请求/头部/连接对象,并查看哪些属性可用。Request.info适用于hapi,但您可能需要检查整个请求对象以查看为什么它不起作用,或者您可以在此处发布您的请求对象供所有人检查。 - Partinder Singh

2
我通常使用这个函数获取客户端IP地址 :)
    return request.headers['x-forwarded-for'] ||
    request.connection.remoteAddress ||
    request.socket.remoteAddress ||
    request.connection.socket.remoteAddress;

希望这有所帮助。

抱歉兄弟@Sparw,我已经尝试过了,结果如下: req.headers ['x-forwarded-for'] => 'undefined' request.connection.remoteAddress || request.socket.remoteAddress || request.connection.socket.remoteAddress => 这些东西会抛出以下错误 'Debug: internal, implementation, error TypeError: Uncaught error: Cannot read property 'remoteAddress' of undefined ' - sunilsmith
也许你需要将所有的 "request" 替换为 "req"? - Sparw

1
我在我的hapi应用程序中使用相同的堆栈,包括nginx和PM2。通过nginx代理请求到同一主机上的节点应用程序将始终导致127.0.0.1作为远程地址,因为nginx将请求转发到同一主机上。
解决方案:有一个专用插件hapi-geo-locate,即使您在反向代理(如nginx)后运行应用程序,也可以确定实际客户端IP地址。 hapi-geo-locate支持各种代理和HTTP标头,因此您应该安全地在不同平台上运行应用程序并获取用户的IP。
希望这能帮助!

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