我在服务器上部署了一个MEAN Stack应用程序,并使用Nginx作为代理服务器来处理请求并重定向到应用程序的特定端口。
例如:当我的应用程序在端口1234上运行时,用户访问URL http://www.abcxyz.com/
并且Nginx命中实际的应用程序URL http://www.abcxyz.com:1234/
。
现在,出于分析目的,我在node.js中编写了一个简短的脚本,该脚本提取访问我网站的用户的IP和位置。我可以看到外部搜索的查询,但我得到了我自己的服务器的IP地址和位置。那是为什么?
那是因为Nginx吗?如何解决此问题并获取用户的实际位置?
更新:我添加了一个适合我的答案。干杯; - )
答案 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);
干杯; - )