当前位置: 首页 > article >正文

Nest.js 实战 (十四):如何获取客户端真实 IP

问题解析

在 Nest.js 应用中,当你试图通过 request.ip 获取客户端的 IP 地址时,如果总是返回 ::1 或者 ::ffff:127.0.0.1,这通常意味着请求来自本地主机。

因为在前后端分离应用中,前端请求后端服务一般的做法都是通过代理,::1IPv6localhost 地址,相当于 IPv4 中的 127.0.0.1,如果使用了本地代理,即配置了一个指向本地(localhost127.0.0.1)的代理,这个代理会导致前端的所有请求是从本地发出的。

要解决这个问题并获取客户端的真实 IP 地址,您需要确保代理服务器正确设置了转发头,比如 X-Forwarded-ForX-Real-IP,并且您的后端服务能够正确读取这些头信息来确定客户端的 IP 地址。

解决方式

以我个人为例,我的前端应用是用 1Panel 面板,网站搭建是用的 OpenResty,当我们配置一个反向代理到本地后端服务时,我们可以看到源文:

location ^~ /api {
    rewrite ^/api(.*) $1 break; # 重写规则,将/api之后的路径提取出来并去掉/api前缀
    proxy_pass http://127.0.0.1:6689; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; // 设置 X-Real-IP 头为客户端的真实 IP 地址。这对于后端服务识别客户端 IP 地址非常重要,特别是在请求经过多个代理的情况下
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; // 设置 X-Forwarded-For 头为通过 proxy_add_x_forwarded_for 指令添加的信息。此头通常用于跟踪客户端 IP 地址以及任何之前的代理 IP 地址
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.1; 
    add_header X-Cache $upstream_cache_status; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name off; 
}

我们可以写一个方法来获取代理后的地址:

import { Request } from 'express';
/**
 * @description: 获取客户端真实 IP
 * @param {Request} req
 */
export const getRealIp = (req: Request): string => {
  const result = req.headers['x-forwarded-for'] || req.headers['x-real-ip'] || req.socket.remoteAddress || req.ip;
  return Array.isArray(result) ? result[0] : result;
};

在代码中使用:

login(@Body() body: LoginParamsDto, @Session() session: CommonType.SessionInfo, @Req() req: Request) {
  return this.authService.login(body, session, getRealIp(req));
}

实际效果

在这里插入图片描述

演示地址:操作日志


http://www.kler.cn/a/355232.html

相关文章:

  • 从家谱的层级结构 - 组合模式(Composite Pattern)
  • 04.HTTPS的实现原理-HTTPS的混合加密流程
  • 基于Pycharm与数据库的新闻管理系统(3)MongoDB
  • GitLab安装及使用
  • Android `android.graphics` 包深度解析:架构与设计模式
  • 前端往后端传递参数的方式有哪些?
  • taro+taro-ui学习
  • RK3588的demo板学习
  • 【GPT提问技巧】如何高效提问GPT:掌握核心技巧,获取高质量回答的终极指南!
  • manjaro kde 24 应该如何设置才能上网(2024-10-13亲测)
  • 【论文速读】Adapter tuning:Parameter-Effificient Transfer Learning for NLP
  • Java微信支付接入(7) - API V3 Native 商户定时查询本地订单
  • Docker部署一款小巧又强大的的自托管网站监控工具Uptime Kuma
  • 谈谈你对vue内置组件keep-alive的了解
  • 吴恩达深度学习笔记(6)
  • 【进阶OpenCV】 (19)-- Dlib库 --人脸表情识别
  • 删除链表的倒数第 N 个结点 | LeetCode-19 | 双指针 | 递归 | 栈 | 四种方法
  • 数据库初体验
  • 淘系商品详情数据封装接口(API接口)json数据格式分析
  • srsRAN 4G设置的笔记
  • Cocos Creator 原生Android项目打 aab 包,升级到Android14(API 34)
  • 想让前后端交互更轻松?alovajs了解一下?
  • Java爬虫:从入门到精通实战指南
  • apache pulsar 安装最新版本, docker安装pulsar3.3.2
  • unity学习笔记-Text mesh Pro
  • web API基础