获取我自己的服务器的IP地址和位置,而不是访问用户的

时间:2017-04-13 14:19:28

标签: node.js nginx server geolocation

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

例如:当我的应用程序在端口1234上运行时,用户访问URL http://www.abcxyz.com/并且Nginx命中实际的应用程序URL http://www.abcxyz.com:1234/

现在,出于分析目的,我在node.js中编写了一个简短的脚本,该脚本提取访问我网站的用户的IP和位置。我可以看到外部搜索的查询,但我得到了我自己的服务器的IP地址和位置。那是为什么?

那是因为Nginx吗?如何解决此问题并获取用户的实际位置?

  

更新:我添加了一个适合我的答案。干杯; - )

2 个答案:

答案 0 :(得分:1)

如果您使用快递:

  

设置非错误信任代理值会导致三个重要因素   变化:

     

req.hostname的值是从中设置的值派生的   X-Forwarded-Host标头,可由客户端或由客户端设置   代理。

     

X-Forwarded-Proto可以通过反向代理设置来告诉应用程序   无论是https还是http,甚至是无效的名称。这个值是   由req.protocol反映。

     

req.ip和req.ips值填充了地址列表   来自X-Forwarded-For。

http://expressjs.com/es/guide/behind-proxies.html

app.enable('trust proxy');
app.all("*", (req, res, next) => {

    console.log(req.ip, req.ips);
    //Do whatever you want or call next()       
});

如果您不使用快递,则可以从标题中获取IP:x-forwarded-for

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

如果您没有获得正确的IP,则需要在Nginx中使用正确的设置:

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header

proxy_set_header X-Forwarded-For $remote_addr;

或将远程用户IP附加到任何现有的X-Forwarded-For值:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

答案 1 :(得分:0)

  

我想感谢@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 Testing命令。这是一个巨大的帮助。 命令:nginx -t

在Node.js中,这是访问客户端IP地址的最合适方式。

var getClientAddress = (req.headers['x-forwarded-for'] || '').split(',')[0] 
                       || req.connection.remoteAddress;
console.log(getClientAddress);

干杯; - )