Node.js 获取我自己服务器的IP地址和位置,而不是访问用户';s
我在服务器上部署了一个MEAN-Stack应用程序,并使用Nginx作为代理服务器来处理请求并重定向到应用程序的特定端口 例如:用户访问URLNode.js 获取我自己服务器的IP地址和位置,而不是访问用户';s,node.js,nginx,server,geolocation,Node.js,Nginx,Server,Geolocation,我在服务器上部署了一个MEAN-Stack应用程序,并使用Nginx作为代理服务器来处理请求并重定向到应用程序的特定端口 例如:用户访问URLhttp://www.abcxyz.com/和Nginx点击实际的应用程序URLhttp://www.abcxyz.com:1234/,因为我的应用程序正在端口1234上运行 现在,出于分析目的,我在node.js中编写了一个简短的脚本,用于获取访问我网站的用户的IP和位置。我可以看到外部搜索的查询,但是我得到了我自己服务器的IP地址和位置。为什么呢 是因
http://www.abcxyz.com/
和Nginx点击实际的应用程序URLhttp://www.abcxyz.com:1234/
,因为我的应用程序正在端口1234上运行
现在,出于分析目的,我在node.js中编写了一个简短的脚本,用于获取访问我网站的用户的IP和位置。我可以看到外部搜索的查询,但是我得到了我自己服务器的IP地址和位置。为什么呢
是因为Nginx吗?如何解决此问题并获取用户的实际位置
更新:我添加了一个答案,这对我来说很有用。干杯;-)
如果您使用的是express: 设置非虚假的信任代理值会导致三个重要结果 变化: req.hostname的值是从 X-Forwarded-Host标头,可由客户端或 代理 反向代理可以设置X-Forwarded-Proto来告知应用程序 无论是https还是http,甚至是无效名称。此值为 由req.protocol反映 req.ip和req.ips值由地址列表填充 来自X-For 如果您不使用express,可以从标题获取IP:
x-forwarded-for
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
如果您没有获得正确的IP,则需要在Nginx中具有正确的设置:
proxy\u set\u header X-Forwarded-For$remote\u addr代码>
或将远程用户IP附加到任何现有的X-Forwarded-For值:
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For代码>
我要感谢@Marcos Casagrande
的回答。
虽然我不得不在他的回答后再工作3小时,但我会的
接受他的领导作为对我问题的回答
下面是对我有用的Nginx-Conf,位于路径/etc/Nginx/Conf.d/abcxyz.com.Conf
server {
listen 80;
listen [::]:80;
server_name abcxyz.com;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass "http://localhost:1234/";
}
}
不需要其他Nginx Conf,在我之前的实现中,我在/etc/Nginx/sites available/default
目录下有另一个Conf文件,该文件与重复的服务器名冲突。
最后,我想在重置更改之前添加使用Nginx测试命令。这是一个巨大的帮助命令:nginx-t
在Node.js中,这是访问客户端IP地址的最合适的方法
var getClientAddress = (req.headers['x-forwarded-for'] || '').split(',')[0]
|| req.connection.remoteAddress;
console.log(getClientAddress);
干杯;-) 我不明白为什么会有谷歌分析标签。你能解释一下为什么会有(或删除它)吗?对不起,我更新了问题,忘记删除标记。请解释一下使用express的部分,我如何在API中访问这些变量?和var ip=req.headers['x-forwarded-for']| | req.connection.remoteAddress代码>返回::1
。正如我的示例中所示,您可以在任何中间件中访问req.ip,如果您提供一些代码,我可能会更具体。非常感谢您的快速响应。。。我已经放置了app.enable('trustproxy')代码>在我的server.ts文件中,就在我的以下代码之后从“/backend/api”导入{serverApi,createTodoApi};get('/data.json',serverApi);使用('/api',createTodoApi())
并访问我的backend/api.ts文件中的变量req.ip
。其中返回的::ffff:127.0.0.1
,这不是从中提取位置的有效ip地址。您可以尝试:proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For
而不是$remote\u addr
感谢@Marcos Casagrande提供您的答案。虽然在你的回答之后,我不得不再工作3小时,但你的线索帮助我解决了这个问题,这就是我接受你回答的原因。干杯:-)
var getClientAddress = (req.headers['x-forwarded-for'] || '').split(',')[0]
|| req.connection.remoteAddress;
console.log(getClientAddress);