zoukankan      html  css  js  c++  java
  • Node.js中,获取req请求的原始IP

    Node.js代码

    var express = require('express');
    var app = express();
    var http = require('http');
    
    var server = http.createServer(app);
    app.set('trust proxy', true);// 设置以后,req.ips是ip数组;如果未经过代理,则为[]. 若不设置,则req.ips恒为[]
    
    app.get('/', function(req, res){
      console.log("headers = " + JSON.stringify(req.headers));// 包含了各种header,包括x-forwarded-for(如果被代理过的话)
      console.log("x-forwarded-for = " + req.header('x-forwarded-for'));// 各阶段ip的CSV, 最左侧的是原始ip
      console.log("ips = " + JSON.stringify(req.ips));// 相当于(req.header('x-forwarded-for') || '').split(',')
      console.log("remoteAddress = " + req.connection.remoteAddress);// 未发生代理时,请求的ip
      console.log("ip = " + req.ip);// 同req.connection.remoteAddress, 但是格式要好一些
      res.send('Hello World');
    });
    
    app.listen(3000);

    Nginx配置

    server
    {
      listen 4000;
      location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        client_max_body_size 10m;                                    # 允许客户端请求的最大单文件字节数
        client_body_buffer_size 128k;                                # 缓冲区代理缓冲用户端请求的最大字节数,
        proxy_connect_timeout 90;                                    # nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout 90;                                       # 后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout 90;                                       # 连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size 4k;                                        # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers 4 32k;                                         # proxy_buffers缓冲区,网页平均在32k以下的设置
        proxy_busy_buffers_size 64k;                                 # 高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;
      }
    }

    运行结果(使用Postman发送GET请求)

    1. 不使用代理

    不使用代理

    命令行输出:

    headers = {"host":"127.0.0.1:3000","connection":"keep-alive","k2":"v2","k1":"v1","cache-control":"no-cache","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2687.0 Safari/537.36","postman-token":"f48d86ee-5375-6768-6f0f-7af1b51f8676","accept":"*/*","accept-encoding":"gzip, deflate, sdch","accept-language":"zh-CN,zh;q=0.8,en;q=0.6"}
    x-forwarded-for = undefined
    ips = []
    remoteAddress = ::ffff:127.0.0.1
    ip = ::ffff:127.0.0.1

    2. 使用代理

    使用代理

    命令行输出

    headers = {"x-real-ip":"127.0.0.1","x-forwarded-for":"127.0.0.1","host":"127.0.0.1","connection":"close","k2":"v2","k1":"v1","cache-control":"no-cache","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2687.0 Safari/537.36","postman-token":"17c79ae7-f00f-6d5f-279a-99d295cbf7d5","accept":"*/*","accept-encoding":"gzip, deflate, sdch","accept-language":"zh-CN,zh;q=0.8,en;q=0.6"}
    x-forwarded-for = 127.0.0.1
    ips = ["127.0.0.1"]
    remoteAddress = ::ffff:127.0.0.1
    ip = 127.0.0.1

    提取出来的一个工具函数

    // 无需设置`app.set('trust proxy', true);`
    function getReqRemoteIp(req){return (req.headers['x-forwarded-for'] || '').split(',')[0] || req.ip;};

    或者是:

    var user_ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

    参考

  • 相关阅读:
    HDU4366 Successor 线段树+预处理
    POJ2823 Sliding Window 单调队列
    HDU寻找最大值 递推求连续区间
    UVA846 Steps 二分查找
    HDU3415 Max Sum of MaxKsubsequence 单调队列
    HDU时间挑战 树状数组
    UVA10168 Summation of Four Primes 哥德巴赫猜想
    UESTC我要长高 DP优化
    HDUChess 递推
    HDU4362 Dragon Ball DP+优化
  • 原文地址:https://www.cnblogs.com/duhuo/p/5700900.html
Copyright © 2011-2022 走看看