nestjs:nginx反向代理服务器后如何获取请求的ip地址

本文介绍了在使用Node.js和NestJS框架时,如何通过配置Nginx和启用trustproxy来确保正确获取真实的客户端IP地址。详细步骤包括设置Nginx代理头和在NestJS中设置信任代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

        如题

参考:

        nodejs+nginx获取真实ip-腾讯云开发者社区-腾讯云

        「转」从限流谈到伪造 IP nginx remote_addr

        

解决办法:

1.设置nginx

        对于代理部分,对http header添加Host、X-Real-IP、X-Forwarded-For(最重要)

        

		location /api {
			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;
			
			proxy_pass   http://localhost:5000;
			proxy_redirect off;
        }

2.nestjs使用express,启用trust proxy

        需要注意,await NestFactory.create<NestExpressApplication>(AppModule);

        需要明确使用NestExpressApplication,虽然nestjs默认express,但是为了调用app.set('trust proxy', true),必须显示声明。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { NestExpressApplication } from '@nestjs/platform-express';

async function bootstrap() {
  const app: NestExpressApplication = await NestFactory.create<NestExpressApplication>(AppModule);
  app.set('trust proxy', true)  //此接口NestExpressApplication才有
  app.use(new HttpRequestMiddleware().use);
  await app.listen(3000);
}
bootstrap().then();

3.可以在Request.ip中获取到值了

/**
 * 自定义请求信息日志记录中间件
 */
import { NextFunction, Request, Response } from 'express';
import { NestMiddleware } from '@nestjs/common';

export class HttpRequestMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    next();

    // 组装日志信息
    const logFormat = {
      httpType: 'Request',
      ip: req.ip.split(':').pop(),
      reqUrl: `${req.headers.host}${req.originalUrl}`,
      reqMethod: req.method,
      httpCode: res.statusCode,
      params: req.params,
      query: req.query,
      body: req.body,
    };

    console.log(JSON.stringify(logFormat));
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值