【问题标题】:Getting IP Address and Location of my own server instead of visiting User's获取我自己服务器的 IP 地址和位置,而不是访问用户的
【发布时间】:2017-09-09 17:21:09
【问题描述】:

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

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

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

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

更新:我添加了一个对我有用的答案。干杯;-)

【问题讨论】:

  • 我不明白为什么它有 google-analytics 标签。你能解释一下为什么会有这个(或删除它)吗?
  • 抱歉,我更新了问题,忘记删除标签了。

标签: node.js nginx server geolocation


【解决方案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()       
});

如果不使用express,可以从header中获取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;

【讨论】:

  • 请解释一下使用 express 的部分,如何在我的 API 中访问这些变量? var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; 返回 ::1
  • 如你在我的例子中看到的,你可以在任何中间件中访问req.ip,也许如果你提供一些代码,我可以更具体。
  • 非常感谢您的快速响应...我已将 app.enable('trust proxy'); 放在我的 server.ts 文件中,紧跟在我的以下代码 import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi()); 之后,并在我的后端/api 中访问变量 req.ip。 ts 文件。它返回::ffff:127.0.0.1,它不是从中获取位置的有效IP地址。
  • 您可以尝试:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 而不是 $remote_addr
  • 感谢@Marcos Casagrande 的回答。尽管在您回答后我不得不再工作 3 小时,但您的线索帮助我解决了问题,这就是我接受您的回答的原因。干杯:-)
【解决方案2】:

感谢@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);

干杯 ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2021-06-06
    相关资源
    最近更新 更多