提问者:小点点

如何通过Node.js获取访问者IP?


我有自己的VPS服务器,我在node.js中有脚本,它显示访问者的IP,但是当我访问网站时,我总是在控制台中获得本地IP地址(127.0.0.1)。 我用的是Nginx。

知道吗?

node.js脚本:

#!/usr/bin/env nodejs

  const http = require('http');

  const host = '127.0.0.1';

  const port = 8080;

  const server = http.createServer((req, res) => {

  res.statusCode = 200;

  res.setHeader('Content-Type', 'text/plain');

  var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || 
  req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress;


console.log(`IP = ${ip}`);

});

server.listen(port, host);

Nginx代理/报头配置:

server {

  listen 80 default_server;

  listen [::]:80 default_server;

  root /var/www/html;

    
  index index.html index.htm index.nginx-debian.html;

  server_name _;

  location / {
            
           try_files $uri $uri/ =404;
           proxy_pass http://127.0.0.1:8080;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_cache_bypass $http_upgrade;
 }
 }

   

共1个答案

匿名用户

您需要操纵您的nginx反向代理来传递请求者的IP地址。 将这两个设置添加到nginx.conf中就可以了。

   proxy_set_header        X-Real-IP       $remote_addr;
   proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

将这些行放在nginx.conf位置{。。。}节中,以及您的proxy-pass和其余部分。

通过这些更改,nginx在每个请求中插入两个http头:X-Forwarded-For和x-real-ip。 (有一个新的标准被转发:header,但到2020年中期,nginx还不能轻松处理它。)

然后,使用app.set()向nodejs程序添加代理服务器支持,以解释这些头。 将这一行放在wwwhttp-server.jsJavascript程序中const app=express()行之后不久。

app.set( 'trust proxy', 'loopback' )

然后,Express将为您处理X-Forwarded-For报头,并将适当的IP地址放入req.IP中。

我链接了一些文档。 你最好读读它。