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

【Nginx】Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

$remote_addr

代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下:

用户客户端--发送请求->Nginx1 --转发请求-->Nginx2->后端服务器

那么,默认情况下,针对Nginx1而言,$remote_addr为用户客户端IP,对Nginx2而言,$remote_addr则为Nginx1的IP。此时如果希望Nginx2也可以获取用户客户端IP,那要怎么处理呢?答案如下:

在Nginx1配置文件中使用proxy_set_header为转发请求设置请求头

proxy_set_header X-Real-IP $remote_addr; // X-Real-IP 为请求头名称,可自定义

然后,在Nginx2 配置文件中通过$http_x_real_ip来获取X-Real-IP请求头的值来获取真实客户端IP.

此时,如果要求“后端服务器”也要获取用户客户端IP,咋处理呢?做法和上述类似,在Nginx2配置文件中,使用proxy_set_header做同样的配置,即:

proxy_set_header X-Real-IP $remote_addr; 

然后,“后端服务器”获取请求头“X-Real-IP”的值即为用户客户端IP。

很多HTTP代理会在HTTP协议头中添加X-Forwarded-For头,用来追踪请求的来源。X-Forwarded-For的格式如下:

X-Forwarded-For包含多个IP地址,每个值通过逗号+空格分开,最左边(client1)是最原始客户端的IP地址,中间如果有多层代理,每一层代理会将连接它的客户端IP追加在X-Forwarded-For右边。

$proxy_add_x_forwarded_for

代表附加$remote_addr变量的客户端请求头X-Forwarded-For ,其值如果包含多个地址,用逗号+空格分隔,标准格式如下:

X-Forwarded-For: clientIP, proxyIP1, proxyIP2 # 最左边的clientIp即为客户端真实IP

如果X-Forwarded-For字段没出现在客户端请求头,$proxy_add_x_forwarded_for 等同于$remote_addr 变量。

这里,假设用户请求过程和上文所述一样,如下:

用户客户端--发送请求->Nginx1 --转发请求-->Nginx2->后端服务器

假设,仅在Nginx1配置文件中进行了以下配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

那么,Nginx2配置的X-Forwarded-For请求头的值即为clientIP当然,这个结论的前提是,客户端IP没有配置X-Forwarded-For请求头,因为如上所述,客户端没有出现这个请求头时,$proxy_add_x_forwarded_for 的值即为$remote_addr 变量的值,否则,则是客户端为X-forwarded-for请求头的实际值

接着,假设Nginx2配置文件也进行以下配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

那么,“后端服务器”获取的X-Forwarded-For请求头的值将为clientIP, Nginx1IP。也就是说以上命令的执行是个叠加的过程(类似Python的列表的append方法的处理过程),可以简单理解为如果存在上级代理,执行以上命令时,会把上级代理IP追加到X-Forwarded-For请求头总,否则把客户端IP $remote_addr、或者客户端X-Forwarded-For请求头的值(如果有的话)追加到X-Forwarded-For请求头中。

参考连接:

Module ngx_http_core_module

Module ngx_http_proxy_module

http://www.lryc.cn/news/148997.html

相关文章:

  • MySQL自动删除binlog日志
  • C++ 文件和流
  • 案例分享:西河水库安全监测信息化系统实施方案
  • 使用Angular和MongoDB来构建具有登录功能的博客应用程序
  • ChatGPT 与前端技术实现制作大屏可视化
  • 视频监控/视频云存储EasyCVR平台接入华为ivs3800平台提示400报错,如何解决?
  • c++基础数据结构
  • 微服务-sentinel详解
  • 【MTK平台】根据kernel log分析wifi 连接的时候流程
  • 【SpringBoot】两种配置文件, 详解 properties 和 yml 的语法格式, 使用方式, 读取配置
  • 基于微信小程序的文化宣传平台的设计与实现(Java+spring boot+微信小程序+MySQL)
  • 一款windows的终端神奇,类似mac的iTem2
  • illegal cyclic inheritance involving trait Iterable_2种解决方式
  • 探秘二叉树后序遍历:从叶子到根的深度之旅
  • 2023全国大学生数学建模A题思路+模型+代码+论文(比赛开始后持续更新)
  • 从输入URL到页面展示过程:深入解析网络请求与渲染
  • Go 使用 Gorm 将操作信息集成到链路跟踪 Jaeger,进行增删改查使用举例,并做可视化UI界面展示(附源码)
  • 【JavaScript精通之道】掌握数据遍历:解锁现代化遍历方法,提升开发效率!
  • opencv android sdk 使用中的问题
  • 《向量数据库指南》——向量数据库与人工智能是一对“双生子
  • WebSocket协议
  • Spring 事务是什么 ?事务的传播机制?
  • 黑马最新MybatisPlus教程!帮你实现快速开发
  • 秒杀场景下用乐观锁解决超卖问题
  • 技术实践|Hive数据迁移干货分享
  • The remote endpoint was in state [TEXT_FULL_WRITING]
  • 微信小程序ios下,border显示不全兼容问题解决
  • 《Effective C++中文版,第三版》读书笔记6
  • 【Docker 】Docker 客户端,容器使用,启动容器,启动已停止运行的容器,停止一个容器,进入容器
  • CTFshow 菜狗杯 web方向 全