【发布时间】:2017-10-19 06:31:44
【问题描述】:
我需要在 hapijs 节点的请求中使用我的应用程序获取客户端的 IP 地址...我们正在使用 pm2 和 Nginx 让服务器实时运行,我们使用了 request.info.address 但它给了服务器本地 IP 为 127.0.0.1 但我需要的是使用我的应用程序的客户端 IP 例如:192.xx111 ...
【问题讨论】:
标签: javascript node.js hapijs
我需要在 hapijs 节点的请求中使用我的应用程序获取客户端的 IP 地址...我们正在使用 pm2 和 Nginx 让服务器实时运行,我们使用了 request.info.address 但它给了服务器本地 IP 为 127.0.0.1 但我需要的是使用我的应用程序的客户端 IP 例如:192.xx111 ...
【问题讨论】:
标签: javascript node.js hapijs
您应该检查反向代理 (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;
【讨论】:
如果您在 Nginx 代理服务器后面运行服务器,则必须使用
req.headers['x-real-ip']
你也可以使用
req.info.remoteAddress
【讨论】:
我总是用这个函数获取客户端 IP 地址 :)
return request.headers['x-forwarded-for'] ||
request.connection.remoteAddress ||
request.socket.remoteAddress ||
request.connection.socket.remoteAddress;
希望对你有帮助。
【讨论】:
我正在使用 nginx 和 PM2 为我的 hapi 应用程序运行相同的堆栈。通过 nginx 将请求代理到同一主机上的节点应用程序将始终导致远程地址为127.0.0.1,因为 nginx 在同一主机上转发请求。
解决方案:有一个专用插件hapi-geo-locate 可以确定实际的客户端 IP 地址,即使您在反向代理(如 nginx)后面运行应用程序也是如此。
hapi-geo-locate 支持各种代理和 HTTP 标头,因此您应该保存并获取用户的 IP 在不同平台上运行您的应用程序。
希望有帮助!
【讨论】: