我在服务器上部署了MEAN Stack应用程序,并且正在使用Nginx作为代理服务器来处理请求并重定向到应用程序的特定端口。
例如:当我的应用程序在端口1234上运行时,用户访问URL http://www.abcxyz.com/
,而Nginx命中实际的应用程序URL http://www.abcxyz.com:1234/
。
现在,出于分析目的,我在node.js中编写了一个简短的脚本,该脚本获取访问我网站的用户的IP和位置。我可以看到从外部搜索的查询,但是我正在获取自己服务器的IP地址和位置。这是为什么?
那是因为Nginx吗?如何解决此问题并获取用户的实际位置?
更新:我添加了一个答案,对我有用。干杯;-)
最佳答案
如果您使用快递:
设置非虚假信任代理值会导致三个重要问题
变化:
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,则可以从标题中获取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;