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;};

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章