Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 获取我自己服务器的IP地址和位置,而不是访问用户';s_Node.js_Nginx_Server_Geolocation - Fatal编程技术网

Node.js 获取我自己服务器的IP地址和位置,而不是访问用户';s

Node.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地址和位置。为什么呢 是因

我在服务器上部署了一个MEAN-Stack应用程序,并使用Nginx作为代理服务器来处理请求并重定向到应用程序的特定端口

例如:用户访问URL
http://www.abcxyz.com/
和Nginx点击实际的应用程序URL
http://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);